PTA甲级1016 Phone Bills (25分)

我的思想大概是建立一个结构体,将每个记录的名字,月,日,小时,分钟分开记,还有一个标志,当bz=1为on,为2为off,先按人名,时间进行排序。再进行一遍遍历,如果存在一个有效通话,就将mapyx 有效定义为1。再从头到尾进行遍历,当发现Node【i】.bz=1,Node[i-1].bz=2,并且名字也相同时就可以计算费用和时间。如果同一天就算直接计算,如果不同一天就算前一个离23:60的时间,和后一个超过0:00的时间,再将中间隔着的天数直接计算。写了两个多小时,最后一个测试点一直过不去!最后才发现测试点3是同一个小时的不同分钟。
#include
#include
#include
#include
using namespace std;
struct node{
int mm,dd,hh,ss;
string name;
int bz;
}Node[1010];
bool cmp(node a,node b){
if(a.name!=b.name) return a.name<b.name;
else if(a.mm!=b.mm) return a.mm<b.mm;
else if(a.dd!=b.dd) return a.dd<b.dd;
else if(a.hh!=b.hh) return a.hh<b.hh;
else if(a.ss!=b.ss) return a.ss<b.ss;
}
map<string,int> rz;
map<string,int> yx;
int main(){
int sj[24];
for(int i=0;i<24;i++){
cin>>sj[i];
}
int n;
cin>>n;
for(int i=0;i<n;i++){
string a,b,c;
cin>>a>>b>>c;
Node[i].name=a;
Node[i].mm=(b[0]-‘0’)*10+b[1]-‘0’;
Node[i].dd=(b[3]-‘0’)*10+b[4]-‘0’;
Node[i].hh=(b[6]-‘0’)*10+b[7]-‘0’;
Node[i].ss=(b[9]-‘0’)*10+b[10]-‘0’;
if(c[1]‘n’) Node[i].bz=1;
else if(c[1]
‘f’) Node[i].bz=2;
rz[Node[i].name]=0;
}
sort(Node,Node+n,cmp);
double zfy=0;
for(int i=1;i<n;i++){
if(Node[i].bz2&&Node[i-1].bz1&&Node[i].mmNode[i-1].mm&&Node[i].nameNode[i-1].name)
yx[Node[i].name]=1;

}
for(int i=0;i<=n;i++){
	if(i!=0&&Node[i].name!=Node[i-1].name&&yx[Node[i-1].name]==1){
		printf("Total amount: $%.2f\n",zfy/100);
		zfy=0;
	}
	if(Node[i].bz==2&&Node[i-1].bz==1&&Node[i].mm==Node[i-1].mm&&Node[i].name==Node[i-1].name){
		if(rz[Node[i].name]==0){
			cout<<Node[i].name;
			printf(" %02d\n",Node[i].mm);
			rz[Node[i].name]=1;
		}
		printf("%02d:%02d:%02d %02d:%02d:%02d ",Node[i-1].dd,Node[i-1].hh,Node[i-1].ss,Node[i].dd,Node[i].hh,Node[i].ss);
		double fy=0;
		int zsj=0;
		if(Node[i].dd==Node[i-1].dd)
		{
			if(Node[i].hh==Node[i-1].hh){
				fy=(Node[i].ss-Node[i-1].ss)*sj[Node[i].hh];
				zsj=Node[i].ss-Node[i-1].ss;
			}
			else{
				for(int j=Node[i-1].hh;j<=Node[i].hh;j++){
			if(j==Node[i-1].hh) {fy=fy+(60-Node[i-1].ss)*sj[j];zsj=zsj+60-Node[i-1].ss;}
			else if(j==Node[i].hh) {fy=fy+(Node[i].ss)*sj[j];zsj=zsj+Node[i].ss;}
			else {fy=fy+60*sj[j];zsj+=60;}
			}
			
		}
		}
		else{
			for(int j=Node[i-1].hh;j<24;j++){
			if(j==Node[i-1].hh) {fy=fy+(60-Node[i-1].ss)*sj[j];zsj=zsj+60-Node[i-1].ss;}
			else {fy=fy+60*sj[j];zsj+=60;}				
		}
		for(int j=0;j<=Node[i].hh;j++){
			if(j==Node[i].hh) {fy=fy+(Node[i].ss)*sj[j];zsj=zsj+Node[i].ss;}
			else {fy=fy+60*sj[j];zsj+=60;}
		}
	    double p=0;
	    for(int j=0;j<24;j++){
			p=p+sj[j]*60;
		}
		fy=fy+p*(Node[i].dd-Node[i-1].dd-1);
		zsj=zsj+24*60*(Node[i].dd-Node[i-1].dd-1);
		}
		zfy+=fy;
		printf("%d $%.2f\n",zsj,fy/100);
	}
}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值