自己写了一个代码只过了测试点0和3.。。。
然后百度发现没有匹配记录的用户不应该输出,于是过了一两天又重新写了一个,代码如下:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=1100;
int per_bill[24];
struct customer{
char id[30];//id
char time_stre[30];//时间
bool state;
int MM,dd,hh,mm;
int rank;
}stu[maxn];
bool mouth[maxn]={
0};//记录用户每月账单是否输出过
int count_phone[maxn]={
0};//记录有几对配对的电话记录 根据rank查找
int total_cost[maxn]={
0};//记录用户总的费用
bool cmp(customer a,customer b)
{
if(strcmp(a.id,b.id)!=0)return strcmp(a.id,b.id)<0;
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 return a.mm<b.mm;
}
int main()
{
for(int i=0;i<24;++i)scanf("%d",&per_bill[i]);
int n;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
char str[30];
scanf("%s %s ",stu[i].id,stu[i].time_stre);
scanf("%s",str);
if(strcmp(str,"on-line")==0)stu[i].state=1;
else stu[i].state=0;
sscanf(stu[i].time_stre,"%d:%d:%d:%d",&stu[i].MM,&stu[i].dd,&stu[i].hh,&stu[i].mm);
}
sort(stu,stu+n,cmp);
for(int i=0;i<n;++i)
{
int LL3=strcmp(stu[i].id,stu[i-1].id);
int LL4 = strcmp(stu[i].id,stu[i+1].id);
if(i!=0&&LL3==0)stu[i].rank=stu[i-1].rank;
else stu[i].rank=i;
if(i<n-1&&stu[i].state==1&&stu[i+1].state==0)++count_phone[stu[i].rank];
if(i<n-1&&stu[i].state==1&&stu[i+1].state==0)
{
if(!mouth[stu[i].rank]&&count_phone[stu[i].rank]!=0)
{
printf("%s %02d\n",stu[i].id,stu[i].MM);
mouth[stu[i].rank]=1;
}
int mid=0;
int cost=0;
int mm1=stu[i].mm,hh1=stu[i].hh,dd1=stu[i].dd;
for(;;)
{
if(mm1==stu[i+1].mm&&hh1==stu[i+1].hh&&dd1==stu[i+1].dd)break;
++mm1;
++mid;
cost+=per_bill[hh1];
if(mm1>=60)
{
mm1=0;
++hh1;
}
if(hh1>=24)
{
hh1=0;
++dd1;
}
}
total_cost[stu[i].rank]+=cost;
printf("%s %s %d $%.2f\n",stu[i].time_stre+3,stu[i+1].time_stre+3,mid,(double)cost/100);
}
if(count_phone[stu[i].rank]!=0&&(i+1>=n||LL4<0))printf("Total amount: $%.2f\n",(double)total_cost[stu[i].rank]/100);
}
}
就过了测试点0,其余都超时了。。。一直找不到问题。等学完stl再来弄吧。