pat1016Phone Bills (25)

56 篇文章 0 订阅

题意分析:

(1)给出一天24个小时各时间段之内长途电话的价格(cents/minutes),再给出若干条通话记录,通话记录由:name 时间 上线/下线,根据通话记录按照要求列出每个人在某个月的通话时间段,时长,通话费用,以及本月通话费用

(2)将每个通话记录包装成一个结构体,然后对结构体数组(Vector)进行按姓名的字典序、时间排序

(3)过滤掉没有匹配项的通话记录,转存到Vector中,最后再遍历Vector依次输出每个人的电话账单,当然也可以直接操作数组,这样操作起来比较麻烦

可能坑点:

(1)本题是PAT(A)题当中难度不大,但是比较繁杂的题目,特别是话费计算的问题以及过滤之后价格输出的格式问题(很多人坑在这上面,总价格的输出一定是在遍历到当前电话记录的姓名和上一个电话记录的姓名不一致时或者是已经遍历完最后一个人)。首先,通话时间段要分为跨越一天、跨越一个小时、在一个小时以内这三种情况讨论。

#include <iostream>
#include <string.h>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <stdio.h>
using namespace std;

struct record
{
    string name;
    int dateTime[4];
    string status;
};
record rec[1001];
int rate[25];
bool cmp(record a,record b)
{
    if(a.name!=b.name)return a.name<b.name;
    else if(a.dateTime[0]!=b.dateTime[0])return a.dateTime[0]<b.dateTime[0];
    else if(a.dateTime[1]!=b.dateTime[1])return a.dateTime[1]<b.dateTime[1];
    else if(a.dateTime[2]!=b.dateTime[2])return a.dateTime[2]<b.dateTime[2];
    else return a.dateTime[3]<b.dateTime[3];
}
int get_min(int dateTime1[4],int dateTime2[4])
{
    return (dateTime2[1]-dateTime1[1])*24*60+(dateTime2[2]-dateTime1[2])*60+dateTime2[3]-dateTime1[3];
}

double payment(int dateTime1[4],int dateTime2[4])
{
    double total=0;
    total+=(dateTime2[1]-dateTime1[1])*60*rate[24];
    if(dateTime2[2]>dateTime1[2]||(dateTime2[2]==dateTime1[2])&&dateTime2[3]>=dateTime1[3])
    {
        double temp=0;
        //通话时间跨越一天
        for(int i=dateTime1[2]+1;i<dateTime2[2];i++)
        {
            temp+=rate[i]*60;
        }
        total+=temp;
        //通话时间跨越一个小时
        if(dateTime2[2]>dateTime1[2])total+=((60-dateTime1[3])*rate[dateTime1[2]]+dateTime2[3]*rate[dateTime2[2]]);
        //通话时间在同一小时之内
        else total+=(dateTime2[3]-dateTime1[3])*rate[dateTime1[2]];
    }
    else
    {
        double temp=0;
        for(int i=dateTime2[2]+1;i<dateTime1[2];i++)
        {
            temp+=rate[i]*60;
        }
        total-=temp;
        if(dateTime1[2]>dateTime2[2])total-=((60-dateTime2[3])*rate[dateTime2[2]]+dateTime1[3]*rate[dateTime1[2]]);
        else total-=(dateTime1[3]-dateTime2[3])*rate[dateTime1[2]];
    }
    return total/100;
}
int main()
{
    int i=0;
    while(i<24)
    {
        scanf("%d",&rate[i]);
        rate[24]+=rate[i];
        i++;
    }
    int N,j=0;
    cin>>N;
    while(j<N)
    {
        cin>>rec[j].name;
        scanf("%d:%d:%d:%d",&rec[j].dateTime[0],&rec[j].dateTime[1],&rec[j].dateTime[2],&rec[j].dateTime[3]);
        cin>>rec[j].status;
        j++;
    }
    sort(&rec[0],&rec[N],cmp);
    vector<record > vec;
    int first=1;
    double pay=0;
    double total=0;
    int minutes=0;
    for(int k=0;k<N;k++)
    {
        int l=k+1;
        if(rec[k].name!=rec[l].name||rec[k].status!="on-line"||rec[l].status!="off-line")continue;
        if(vec.size()>0&&rec[k].name!=vec.back().name)
        {
            first=1;
            printf("Total amount: $%.2lf\n",total);
            total=0;
        }
        vec.push_back(rec[k]);
        vec.push_back(rec[l]);
        if(first)
        {
            cout<<rec[k].name<<" "<<setw(2)<<setfill('0')<<rec[k].dateTime[0]<<endl;
            first=0;
        }
        pay=payment(rec[k].dateTime,rec[l].dateTime);
        minutes=get_min(rec[k].dateTime,rec[l].dateTime);
        total+=pay;
        printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",
        rec[k].dateTime[1],rec[k].dateTime[2],rec[k].dateTime[3],
        rec[l].dateTime[1],rec[l].dateTime[2],rec[l].dateTime[3],
        minutes,pay);
    }
    if(vec.size()>0)printf("Total amount: $%.2lf\n",total);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值