Day 16 算法笔记之算法初步4.1 排序(3)

目录

1.Phone Bills


1.Phone Bills

从构思到写完,总共约3小时,我太弱鸡了,淦

#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <algorithm>
using namespace std;

struct record{
	
	char name[22];
	int date[4];
	char status[10];
	
	int flag = -1;
	
	int status_temp=0;
	int use = -1;
	double sum=0;
	int min=0;
	
}rec[1002];

bool cmp(record a,record b){
	if(strcmp(a.name,b.name)!=0){
		return strcmp(a.name,b.name)<0;
	}else if(a.date[1]!=b.date[1]){
		return a.date[1]<b.date[1];
	}else if(a.date[2]!=b.date[2]){
		return a.date[2]<b.date[2];
	}else if(a.date[3]!=b.date[3]){
		return a.date[3]<b.date[3];
	}
}

int main(){
	
	int cha[26];
	
	for(int i=0;i<24;i++){
		scanf("%d",&cha[i]);
	}
	
	int num;
	
	scanf("%d",&num);
	
	for(int i=0;i<num;i++){
		scanf("%s %d:%d:%d:%d %s",&rec[i].name,&rec[i].date[0],&rec[i].date[1],&rec[i].date[2],&rec[i].date[3],&rec[i].status);
		if(rec[i].status[1]=='n'){
			rec[i].status_temp=1;
		}else{
			rec[i].status_temp=-1;
		}
		
	}
	
	sort(rec,rec+num,cmp);
	
	for(int i=0;i<num;i++){
		if(rec[i].flag==-1){
			for(int j=i+1;j<num;j++){
				if(rec[j].flag==-1){
					if(rec[i].status_temp==rec[j].status_temp){
						break;
					}
					
					if((strcmp(rec[i].name,rec[j].name)==0)&&(rec[i].status_temp!=rec[j].status_temp)){
						rec[i].flag = j;
						rec[j].flag = i;
						break;
					}
				}
			}
		}
	}
	
	int cou[1002]={0};
	
	int n=0,pos=0;
	
	int xx[1000]={0},l=1;
	
	for(int i=0;i<num;i++){
		if((rec[i].use==-1)&&(rec[i].flag!=-1)){
			
			if(strcmp(rec[i].name,rec[n].name)!=0){
				xx[l] = i;
				l+=1;
				n=i;
				pos++;
				cou[pos]+=1;
				
			}else{
				cou[pos]+=1;
			}
			
			rec[i].use=1;
			rec[rec[i].flag].use=2;
			
			int d1=rec[i].date[1],h1=rec[i].date[2],m1=rec[i].date[3];
			int d2=rec[rec[i].flag].date[1],h2=rec[rec[i].flag].date[2],m2=rec[rec[i].flag].date[3];
			
			int time[25]={0};
			
			while(d1!=d2||h1!=h2||m1!=m2){
				
				m1++;
				
				time[h1]+=1;
				
				if(m1==60){
					h1+=1;
					m1=0;
				}
				
				if(h1==24){
					h1=0;
					d1+=1;
				}
					
			}
			
			for(int j=0;j<24;j++){
				rec[i].min+=time[j];
				rec[i].sum+=time[j]*cha[j];
			}
			
			rec[i].sum/=100;
			
		}
	}
	
	for(int i=0;i<pos+1;i++){
		
		double whole_sum = 0;
		
		int n = 0;
		
		printf("%s %02d\n",rec[xx[i]].name,rec[xx[i]].date[0]);
		
		for(int j = xx[i];j<num;j++){
			if(rec[j].use==1){
				n++;
				printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",rec[j].date[1],rec[j].date[2],rec[j].date[3],rec[rec[j].flag].date[1],rec[rec[j].flag].date[2],rec[rec[j].flag].date[3],rec[j].min,rec[j].sum);
				whole_sum+=rec[j].sum;
			}
			
			if(n==cou[i]){
				break;
			}
		}
		
		printf("Total amount: $%.2f\n",whole_sum);
		
		
	}
	
	return 0;
}

上一篇:MDK基于STM32汇编程序并编写软件程序


下一篇:242.有效的字母异位词