PAT甲1016 Phone Bills (25)

这道题做到抓狂……理一下还是比较简单的,但是真的花了好久的时间……
注意审题啊审题!!!!
题目说明每次输入保证有一组匹配的记录,我理解为每个用户至少都有一组匹配记录……于是总是有两个测试点过不了,改到抓狂。
若某个用户没有匹配记录,则不输出该用户的任何内容。

#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <map> 
#include <vector>
#include <queue>
using namespace std;

map<string,bool> line;
map<string,int> cus;

double cost[24];
int N;
int month;

struct record
{
    int sd;
    int time;
    bool online;
};

struct customer
{
    string id;
    vector<record> r;
    double sum;
}c[1010];

bool cmp1(customer a ,customer b)
{
    return a.id<b.id;
}

bool cmp(record a,record b)
{
    if(a.sd!=b.sd)return a.sd<b.sd;
    else return a.time<b.time;
}


double cal(record a,record b,int& totalm)
{
    double sum=0;
    int flag=a.time/60;
    int minute=0;
    while(cmp(a,b))
    {
        a.time++;
        totalm++;
        sum+=cost[flag];
        int temp=a.time/60;
        if(temp>flag)
        {
            if(temp==24)
            {
                flag=0;
                a.sd++;
                a.time=0;
            }
            else
            {
                flag++;
            }
        }
    }
    return sum;
}

int main()
{
    for(int i=0;i<24;i++)
    {
        scanf("%lf",&cost[i]);
    }
    line["on-line"]=true;
    line["off-line"]=false;
    scanf("%d",&N);
    int num=0;
    for(int i=0;i<N;i++)
    {
        string id;
        int day,h,m;
        string linestatus;
        cin>>id;
        scanf("%d:%d:%d:%d",&month,&day,&h,&m);
        record temp;
        temp.sd=day;
        temp.time=h*60+m;
        cin>>linestatus;
        temp.online=line[linestatus];
        if(cus.find(id)==cus.end())
        {
            cus[id]=num++;
            c[cus[id]].id=id;
        }
        c[cus[id]].r.push_back(temp);
    }
    sort(c,c+num,cmp1);
    for(int i=0;i<num;i++)
    {
        sort(c[i].r.begin(),c[i].r.end(),cmp);
        int index=0,start=0;
        bool strat=false;

        while(index<c[i].r.size()-1)
        {
            if(c[i].r[index].online==true&&c[i].r[index+1].online==false)
            {
                if(!start)
                {
                    cout<<c[i].id<<" ";
                    printf("%02d\n",month);
                    start=true;
                }
                record a=c[i].r[index];
                record b=c[i].r[index+1];
                int totalm=0;
                double s=cal(a,b,totalm);
                c[i].sum+=s;
                printf("%02d:%02d:%02d",a.sd,a.time/60,a.time%60);
                printf(" ");
                printf("%02d:%02d:%02d",b.sd,b.time/60,b.time%60);
                printf(" ");
                printf("%d ",totalm);
                printf("$%.2f\n",s/100);
            }
            index++;
        }
        if(start)
        {
            printf("Total amount: $%.2f\n",c[i].sum/100);
        }
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yhy489275918/article/details/80444407
今日推荐