【PAT-A】1016. Phone Bills 写题记录

这道题比较烦人,关键是逻辑弄通。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct users{
	char ID[24];
	int mon;
	int dd;
	int hh;
	int mm;
	int state = 0;  //on line =1  offline =2 
}user[1010]; 

bool cmp(users a, users b) {
	int s=strcmp(a.ID,b.ID);
	if (s!=0) return s<0;
	else if (a.mon!=b.mon) return a.mon<b.mon;
	else if (a.dd!=b.dd) return a.dd<b.dd;
	else if (a.hh!=b.hh) return a.hh<b.hh;
	else return a.mm<b.mm; 
} 

int price[24]; //每小时的费用 

double output(users a,users b){  //计算两者的资费 
	double num=0;
	if (b.mon==a.mon){
		if (b.hh!=a.hh || (b.hh==a.hh && b.mm!=a.mm)){ //先使得h和m一致,再看d差几个 
			while (b.hh != a.hh){  //先使h一致 
				num = num+price[a.hh]*(60-a.mm);
				a.mm = 0;
				a.hh++;
				if (a.hh==24) {
					a.hh=0;
					a.dd++;
				}
			}
			num = num+price[a.hh]*(b.mm-a.mm);	
			a.mm = b.mm;			//m一致 
		}
		while(b.dd!=a.dd) {  //再算d 
			for (int j=0;j<24;j++){
				num = num+ price[j]*60;
			}
			a.dd++;
		}
	}
	return num;
}
int main(){
	for (int i=0;i<24;i++){
		scanf("%d",&price[i]);
	}
	int n;
	scanf("%d",&n);
	for (int i=0;i<n;i++){
		char state[8];
		scanf("%s",&user[i].ID);
		scanf("%d:%d:%d:%d",&user[i].mon,&user[i].dd,&user[i].hh,&user[i].mm);
		scanf("%s",&state);
		if (strcmp(state,"on-line")==0) user[i].state = 1;
		else user[i].state = 2;
	}
	sort(user,user+n,cmp);  //排序 
	char now[24];  //当前的ID 
	int i=0,t=0;
	bool flag[1010]={false}; //头和尾只输出一次,用flag[t]来标记 
	double tnum=0;
	while (i<n){ //要遍历全部 
		strcpy(now,user[i].ID);
		while (strcmp(now,user[i].ID)==0){  //遇到ID与NOW一致 
			double num=0;
			if (strcmp(now,user[i+1].ID)==0 && user[i].state==1 && user[i+1].state==2){ //需要输出的情况 
				if (flag[t]==false){ //判断是不是第一次输出,若是第一次要额外输出信息 
					printf("%s %02d\n",user[i].ID,user[i].mon);
					flag[t]=true;
				} //非额外则正常输出 
				printf("%02d:%02d:%02d ",user[i].dd,user[i].hh,user[i].mm);
				printf("%02d:%02d:%02d ",user[i+1].dd,user[i+1].hh,user[i+1].mm);
				int ttime = (user[i+1].dd*24*60+user[i+1].hh*60+user[i+1].mm)-(user[i].dd*24*60+user[i].hh*60+user[i].mm);
				printf("%d ",ttime);
				num = output(user[i],user[i+1]); //调用函数来计算资费 
				tnum = tnum +num;
				printf("$%.2f\n",num/100);
				i=i+2; //过了一对i到下一个 
			}
			else { //若是非输出,i就1个1个走,直到ID与NOW不一致 
				i=i+1;
			}
		} //ID与NOW不一致,要更新NOW,并且输出total amount 
		if (flag[t]==true) {
			printf("Total amount: $%.2f\n",tnum/100);
			tnum=0;
			t++;
		}
	} 
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_43456345/article/details/85255897