本质上是一个很简单的问题,但是在写代码实现上发现自己还是一个弱鸡;
主要的思路就是先进行记录的录入和排序,按照字典序、时间大小进行排序,使得同一个人的记录在一起,并且按照日期递增;
后续难就难在怎么进行on-line和off-line状态的查询以及计费的计算;
对于状态查询,示例代码有如下操作:
1.先进行同一人记录的查询,找到最后一条的边界,并且在寻找边界的时候,查找是否有online和offline的匹配,如果没有,则说明这个人通话没必要计费;
2.如果有配对的状态,从开始的边界到最后边界进行依次两个两个枚举,如果两个状态匹配,则进行计费的计算;
对于计费计算来说,最根本的难点是怎么计算时长,以及对不同小时的费用进行计费;
示例代码给了一个很好的思路,那就是对于起始时间,进行重复的分钟+1枚举,并且进行时间进制计算,直到和结束时间相同;由于题目中时按分钟计费的,所以只需要关注递增的起始时间的小时变化即可;
这段代码如下所示:
void get_ans(int on,int off,int& time,int& money){
temp=rec[on];
while(temp.dd<rec[off].dd||temp.hh<rec[off].hh||temp.mm<rec[off].mm){
time++;
money+=toll[temp.hh];
temp.mm++;
if(temp.mm>=60){
temp.mm=0;
temp.hh++;
}
if(temp.hh>=24){
temp.hh=0;
temp.dd++;
}
}
}
总体的代码如下所示:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010;
int toll[25];
struct Record{
char name[25];
int month,dd,hh,mm;
bool status;
}rec[maxn],temp;
void get_ans(int on,int off,int& time,int& money){
temp=rec[on];
while(temp.dd<rec[off].dd||temp.hh<rec[off].hh||temp.mm<rec[off].mm){
time++;
money+=toll[temp.hh];
temp.mm++;
if(temp.mm>=60){
temp.mm=0;
temp.hh++;
}
if(temp.hh>=24){
temp.hh=0;
temp.dd++;
}
}
}
bool cmp(Record a,Record b){
int s=strcmp(a.name,b.name);
if(s!=0)
return s<0;
else if(a.month!=b.month)
return a.month<b.month;
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 main(){
for(int i=0;i<24;i++){
scanf("%d",&toll[i]);
}
int n;
scanf("%d",&n);
char line[10];
for(int i=0;i<n;i++){
scanf("%s",rec[i].name);
scanf("%d:%d:%d:%d",&rec[i].month,&rec[i].dd,&rec[i].hh,&rec[i].mm);
scanf("%s",line);
if(strcmp(line,"on-line")==0){
rec[i].status=true;
}else{
rec[i].status=false;
}
}
sort(rec,rec+n,cmp);
int on=0,off,next;
while(on<n){
int needPrint=0;
next=on;
while(next<n&&strcmp(rec[next].name,rec[on].name)==0){
if(needPrint==0&&rec[next].status==true){
needPrint=1;
}else if(needPrint==1&&rec[next].status==false){
needPrint=2;
}
next++;
}
if(needPrint<2){
on=next;
continue;
}
int AllMoney=0;
printf("%s %02d\n",rec[on].name,rec[on].month);
while(on<next){
while((on<next-1)&&!(rec[on].status==true&&rec[on+1].status==false)){
on++;
}
off=on+1;
if(off==next){
on=next;
break;
}
printf("%02d:%02d:%02d ",rec[on].dd,rec[on].hh,rec[on].mm);
printf("%02d:%02d:%02d ",rec[off].dd,rec[off].hh,rec[off].mm);
int time=0,money=0;
get_ans(on,off,time,money);
AllMoney+=money;
printf("%d $%.2f\n",time,money/100.0);
on=off+1;
}
printf("Total amount: $%.2f\n",AllMoney/100.0);
}
system("pause");
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。