我的思想大概是建立一个结构体,将每个记录的名字,月,日,小时,分钟分开记,还有一个标志,当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
}
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);
}
}
}