1016 Phone Bills (25 分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lianwaiyuwusheng/article/details/87800959

问题描述:给定每天每个时段的通话费用和每个人的打挂电话的记录,输出每个人的总费用和通话记录。

解题思路:用map将每个人与自己的通话记录关联起来,再对记录排序,计算费用,输出。计算费用,采用累积的方法,T1--T2的费用相当于从0->T2的费用减去0->T1的费用。

AC代码:

#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<string>
using namespace std;
typedef struct rec{
    int M,D,H,m;
    bool tag;
    rec(int a,int b,int c,int d,bool t):M(a),D(b),H(c),m(d),tag(t){}
}rec;
map<string,vector<rec> >R;
int toll[25],rate[25];
double all;
bool cmp(rec &a,rec &b)
{
    return a.D*24*60+a.H*60+a.m<b.D*24*60+b.H*60+b.m;
}
void tolls(rec &a,rec &b)//计算一次通话费用
{
    printf("%02d:%02d:%02d %02d:%02d:%02d ",a.D,a.H,a.m,b.D,b.H,b.m);
    printf("%d ",(b.D-a.D)*24*60+(b.H-a.H)*60+b.m-a.m);
    //重点,如何计算费用!!!!从一天0点开始,累积计算
    double x=(b.D-a.D)*rate[24]*60+(rate[b.H]-rate[a.H])*60+toll[b.H]*b.m-toll[a.H]*a.m;
    printf("$%.2lf\n",x/100.00);   //为什么%.2llf会出错?????????
    all+=x;
}
int main()
{
    freopen("test.txt","r",stdin);
    for(int i=0;i<24;++i){
        scanf("%d",&toll[i]);
        rate[i+1]+=rate[i]+toll[i];//rate为累积费用,toll为小时费用
    }
    int N;
    scanf("%d",&N);
    while(N--){
        string id,tag;
        bool t;
        int m,d,h,s;
        cin>>id;
        scanf("%d:%d:%d:%d",&m,&d,&h,&s);
        cin>>tag;
        tag=="on-line"?t=1:t=0;
        R[id].push_back(rec(m,d,h,s,t));//将记录根据人的不同分别储存
    }
    map<string,vector<rec> >::iterator it=R.begin();
    while(it!=R.end()){
        all=0;
        bool flag=0;
        sort(it->second.begin(),it->second.end(),cmp);//按照时间排序
        int n=it->second.size();
        for(int i=0;i<n;++i){//遍历该人的所有通话记录
            if(it->second[i].tag){//在线
                int j=i+1;
                while(j<n&&it->second[j].tag){++i;++j;}//离线
                if(j<n){//匹配,注意!!!!可能一个人的通话记录一次都没匹配过
                    if(!flag)printf("%s %02d\n",it->first.c_str(),it->second[i].M);//访问map的value数组
                    tolls(it->second[i],it->second[j]);
                    ++i;flag=1;
                }
            }
        }
        if(flag)printf("Total amount: $%.2lf\n",all/100.00);
        ++it;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lianwaiyuwusheng/article/details/87800959
今日推荐