1016 Phone Bills (25分)(待续。。,没有真实通话记录的不应该输出的问题没解决)

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int Maxn = 2020;


int toll[40];
int oneday = 0;

typedef struct record
{
    string id;
    int time[4]; //0=m,1=d,2=h,3=minute;
    int on; //0=on,1=off;

};

bool cmp(record a,record b)
{
    if(a.id != b.id)
        return a.id < b.id;
    else if(a.time[0] != b.time[0])
        return a.time[0] < b.time[0];
    else if(a.time[1] != b.time[1])
        return a.time[1] < b.time[1];
    else if(a.time[2] != b.time[2])
        return a.time[2] < b.time[2];
    else if(a.time[3] != b.time[3])
        return a.time[3] < b.time[3];

}

int calculate(int a[],int b[],int &t)
{
    int sum = 0;
    t=0;
    for(int i = a[1];i<=b[1];i++) //从开始的日到结束的日
    {
        if(i == a[1] && i != b[1]) //开始的一天且不是最后一天算剩下的时间
        {
            for(int j = a[2];j<24;j++)
            {
                if(j == a[2]) //如果是开始的小时则算剩下的分钟
                {
                    sum += toll[j] * (60 - a[3]);
                    t += 60 - a[3];
                }
                else
                {
                    sum += toll[j] * 60; //其他直接算一小时的费用
                    t+=60;
                }

            }
        }
        else if(i == b[1] && i != a[1]) //末尾的一天且不是第一天算过了多少时间
        {
            for(int j = 0;j<=b[2];j++)
            {
                if(j == b[2]) //如果是结束的小时
                {
                    sum += b[3] * toll[j]; //计算过了几分钟
                    t+=b[3];
                }
                else
                {
                    sum += toll[j] * 60; //计算一小时的钱
                    t+=60;
                }

            }
        }
        else if(i == a[1] && i == b[1])
        {
            for(int j = a[2];j<=b[2];j++)
            {
                if(j == a[2] && j != b[2])
                {
                     sum += toll[j] * (60 - a[3]);
                     t+=60 - a[3];
                }
                else if(j == b[2] && j != a[2])
                {
                    sum += b[3] * toll[j]; //计算过了几分钟
                    t+=b[3];
                }
                else if(a[2] == b[2]) //如果是同一个小时
                {
                    sum += toll[j] * (b[2] - a[2]);
                    t+=b[2] - a[2];
                }
                else
                {
                    sum += toll[j] * 60; //计算一小时的钱
                    t+=60;
                }
            }
        }
        else
        {
            sum += oneday; //全天费用
            t+=24 * 60;
        }
    }
    printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",a[1],a[2],a[3],b[1],b[2],b[3],t,sum * 1.00 / 100);


    return sum;
}




int main()
{
    // freopen("1.txt","r",stdin);

    for(int i = 0;i<24;i++)
    {
        scanf("%d",&toll[i]);
        oneday += toll[i] * 60;
    }
    int n;
    scanf("%d",&n);
    record line[Maxn];
    for(int i = 0;i<n;i++)
    {
        string temp;
        cin>>line[i].id;

        scanf("%d:%d:%d:%d",&line[i].time[0],&line[i].time[1],&line[i].time[2],&line[i].time[3]);

        cin>>temp;
        if(temp == "on-line")
            line[i].on = 0;
        else
            line[i].on = 1;
    }
    sort(line,line+n,cmp); //按照名字和时间排顺序

//===========将每个人的记录分割===============
    int peo[Maxn] = {0},num=1;
    peo[0] = 0;
    string now = line[0].id;
    for(int i = 0;i<=n;i++)
    {
        if(line[i].id != now)
        {
            peo[num++] = i;
            now = line[i].id;
        }
    }

    //记录每个人的话费账单

    for(int p=0;p<num-1;p++)
    {
        cout<<line[peo[p]].id<<" ";
        printf("%02d\n",line[peo[p]].time[0]);    //输出该人的id和月份
//
        int start[4] = {0},endt[4]={4},sum = 0,t=0;
        for(int i = peo[p];i<peo[p+1];i++)   //每个人的所有记录
        {
            if(line[i].on == 0)
            {
                for(int j = 0;j<4;j++)
                {
                    start[j] = line[i].time[j]; //只要有ontime的记录就更新
                }
            }
            else if(line[i].on == 1 && start[0] != 0) //已经有过ontime的记录之后的第一个offtime就开始计算
            {
                sum += calculate(start,line[i].time,t);  //计算该次的话费
                fill(start,start+4,0); //清空start数组
            }
        }

        printf("Total amount: $%.2f\n",sum * 1.00 /100); //输出总话费
        sum = 0; //清空sum
        t=0;
    }


    return 0;
}

发布了111 篇原创文章 · 获赞 4 · 访问量 3195

猜你喜欢

转载自blog.csdn.net/qq_15556537/article/details/104084244