PAT A1016 Phone Bills (25 分) 超时(未解决)

自己写了一个代码只过了测试点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再来弄吧。

猜你喜欢

转载自blog.csdn.net/WT_01011010/article/details/115164338