PAT 甲级 1016 Phone Bills (25分)

Note

  • 排序

  • 不要算样例数据的和!!!测试点不一样!!!

  • 计算费用从00:00:00到dd:hh:mm计算可以避免跨天的问题.

    e.g. 01:12:00到02:02:00——可以计算 bill(02:02:00-00:00:00) - bill(01:12:00-00:00:00)

  • 巧用Map!!map<string, vector< node > > string可以作为索引,vector< node > 作为值。

//柳神Code摘取
struct node {
    string name;
    int status, month, time, day, hour, minute;
};

vector<node> data(n);  //可以用vector代替结构体数组
map<string, vector<node>> custom;
for (int i = 1; i < n; i++) {
    if (data[i].name == data[i - 1].name && data[i - 1].status == 1 && data[i].status == 0) {
        custom[data[i - 1].name].push_back(data[i - 1]);
        custom[data[i].name].push_back(data[i]);
    }
}

//map的遍历
for (auto it : custom) {
    vector<node> temp = it.second;
    cout << it.first;
    printf(" %02d\n", temp[0].month);
    for (int i = 1; i < temp.size(); i += 2) {
        //code
    }
}

Code:

#include<bits/stdc++.h>
using namespace std;

struct customer{
	string name;
	int m,d,h,min,times;
	bool status;
};

bool compare(customer a,customer b){
	if(a.name!=b.name) return a.name<b.name;
	else{
		return a.times<b.times;
	}
}

int main(){
	#ifndef ONLINE_JUDGE
		freopen("data.txt","r",stdin);
	#endif
	
	int money[24];
	int n;
	string st;
	int m,d,h,mi;
	for(int i=0;i<24;i++)
		cin>>money[i];
	cin>>n;
	
	struct customer cus[1001];
	for(int i=0;i<n;i++){
		cin>>cus[i].name;
		scanf("%02d:%02d:%02d:%02d",&cus[i].m,&cus[i].d,&cus[i].h,&cus[i].min);
		cin>>st;
		cus[i].times=cus[i].min+cus[i].h*60+cus[i].d*24*60;
		if(st=="on-line") cus[i].status=true;
		else cus[i].status=false;
	}
	sort(cus,cus+n,compare);
	
	int mm[2],dd[2],hh[2],minn[2];
	int i=0;
	while(i<n){
		int sign=0,fff=0;
		double cost=0,tmp;
		while(cus[i].name==cus[i+1].name){
			fff=1;
			i++;
			if(cus[i-1].status==true&&cus[i].status==false){
				if(sign==0){
					sign=1;
					cout<<cus[i-1].name;
					printf(" %02d\n",cus[i-1].m);
				}
				printf("%02d:%02d:%02d ",cus[i-1].d,cus[i-1].h,cus[i-1].min);
				printf("%02d:%02d:%02d ",cus[i].d,cus[i].h,cus[i].min);
				int time=cus[i].times-cus[i-1].times;
				printf("%d ",time);
				tmp=0;
				if(cus[i-1].d==cus[i].d){
					if(cus[i-1].h==cus[i].h) tmp=time*money[cus[i-1].h];
					else{
						for(int j=cus[i-1].h;j<=cus[i].h;j++){
							if(j==cus[i-1].h) tmp+=(60-cus[i-1].min)*money[cus[i-1].h];
							else if(j==cus[i].h) tmp+=cus[i].min*money[cus[i].h];
							else tmp+=60*money[j];
						}
					}
				}
				else{
					for(int k=cus[i-1].d;k<=cus[i].d;k++){
						if(k==cus[i-1].d){
							for(int t=cus[i-1].h;t<24;t++){
								if(t==cus[i-1].h) tmp+=(60-cus[i-1].min)*money[t];
								else tmp+=60*money[t];
							}
						}
						else if(k==cus[i].d){
							for(int t=0;t<=cus[i].h;t++){
								if(t==cus[i].h) tmp+=cus[i].min*money[t];
								else tmp+=60*money[t];
							}
						}
						else{
							for(int t=0;t<24;t++) tmp+=60*money[t];
						}
					}
				}
				tmp=tmp*1.0/100;
				cost+=tmp; 
				printf("$%.2lf\n",tmp);
			}
		}
		if(sign==1){
			printf("Total amount: $%.2lf\n",cost);
		}
		if(fff==0) i++;
	}
	
	return 0;	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值