1016. Phone Bills (25)

A long-distance telephone company charges its customers by the following rules:

Making a long-distance call costs a certain amount per minute, depending on the time of day when the call is made. When a customer starts connecting a long-distance call, the time will be recorded, and so will be the time when the customer hangs up the phone. Every calendar month, a bill is sent to the customer for each minute called (at a rate determined by the time of day). Your job is to prepare the bills for each month, given a set of phone call records.

Input Specification:

Each input file contains one test case. Each case has two parts: the rate structure, and the phone call records.

The rate structure consists of a line with 24 non-negative integers denoting the toll (cents/minute) from 00:00 - 01:00, the toll from 01:00 - 02:00, and so on for each hour in the day.

The next line contains a positive number N (<= 1000), followed by N lines of records. Each phone call record consists of the name of the customer (string of up to 20 characters without space), the time and date (mm:dd:hh:mm), and the word "on-line" or "off-line".

For each test case, all dates will be within a single month. Each "on-line" record is paired with the chronologically next record for the same customer provided it is an "off-line" record. Any "on-line" records that are not paired with an "off-line" record are ignored, as are "off-line" records not paired with an "on-line" record. It is guaranteed that at least one call is well paired in the input. You may assume that no two records for the same customer have the same time. Times are recorded using a 24-hour clock.

Output Specification:

For each test case, you must print a phone bill for each customer.

Bills must be printed in alphabetical order of customers' names. For each customer, first print in a line the name of the customer and the month of the bill in the format shown by the sample. Then for each time period of a call, print in one line the beginning and ending time and date (dd:hh:mm), the lasting time (in minute) and the charge of the call. The calls must be listed in chronological order. Finally, print the total charge for the month in the format shown by the sample.

Sample Input:
10 10 10 10 10 10 20 20 20 15 15 15 15 15 15 15 20 30 20 15 15 10 10 10
10
CYLL 01:01:06:01 on-line
CYLL 01:28:16:05 off-line
CYJJ 01:01:07:00 off-line
CYLL 01:01:08:03 off-line
CYJJ 01:01:05:59 on-line
aaa 01:01:01:03 on-line
aaa 01:02:00:01 on-line
CYLL 01:28:15:41 on-line
aaa 01:05:02:24 on-line
aaa 01:04:23:59 off-line
Sample Output:
CYJJ 01
01:05:59 01:07:00 61 $12.10
Total amount: $12.10
CYLL 01
01:06:01 01:08:03 122 $24.40
28:15:41 28:16:05 24 $3.85
Total amount: $28.25
aaa 01
02:00:01 04:23:59 4318 $638.80
Total amount: $638.80

题目大意:

一家长途电话公司以下列规则对其客户收费:
打长途电话每分钟花费一定的费用,这要视在一天中通话的时间点而定。当用户开始链结长途通话时,那个时刻将会被记录,并且用户挂断电话的时刻也会被记录。每个月,都会发送给用户他每一分钟的通话清单(按当天的通话时间而定)。你的任务是利用给定的通话记录准备每个月的通话清单。
输入规格:
每个输入文件包含一个测试用例。每个测试用例包含费率结构和通话记录两部分。
费率结构有一行24个非负整数构成,代表从00:00到01:00收费的费率(分/分钟),从01:00到02:00收费的费率等等每天每个时刻收费的费率。
下一行包含一个正整数N(<=1000),接下来是N行记录。每行记录由用户名(由不超过20个字符且不包含空格的字符组成),通话的日期和时间,单词“在线”和“离线”三部分组成。
对于每个测试用例,所有的日期都在一个月之内。每个“在线”记录都于按时间排序的该用户的“离线”记录相匹配。任何没有“离线”记录与之匹配的“在线”记录都将被忽略,因为“离线”记录与“在线”记录没有配对。他保证在输入中至少有一个调用是完全成对的。你可以假设没有两个记录用户名和用户时间是完全相同的。时间记录用24小时制。
输出规格:
对于每个测试用例,你必须打印出每个用户的电话清单。
用户清单必须按用户名的字母顺序打印。对于每个用户,首先在一行中以示例的格式打印出用户名和清单的月份。然后对于每次通话时间,在一行中打印出开始和结束的日期和时间(dd:hh:mm),电话持续时间和电话费用。电话必须按时间顺序列出。最后,按样本格式打印出当月的总费用。

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
    char name[21];
    int month;
    int date;
    int hour;
    int minute;
    int T;
    int tag;
    char state[10];
}customer[1001];
int cmp(const void *a,const void *b)
{
    if(strcmp((*(node *)a).name ,(*(node *)b).name)!=0)
    return  strcmp((*(node *)a).name ,(*(node *)b).name)>0 ? 1 : -1;
    else
       return (*(node *)a).T >(*(node *)b).T ? 1 : -1;
}
int time[25];
double caculate(int t)
{
    int i,j;
    double sum=0;
    for(i=0;i<t/60;i++)
    {
        sum+=time[i%24]*60/100.0;
    }
    sum+=time[i%24]*(t%60)/100.0;
    return sum;
}
int main()
{
    int i,j,n,m,k,t,cmonth,flag=0;
    double charge,total;
    char cname[21];
    for(i=0;i<24;i++)
    {
        scanf("%d",&time[i]);
    }
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%s%d%*c%d%*c%d%*c%d%s",customer[i].name,&customer[i].month,&customer[i].date,&customer[i].hour,&customer[i].minute,customer[i].state);
        if(strcmp(customer[i].state,"on-line")==0)
        {
            customer[i].tag=0;
        }
        else
        {
          customer[i].tag=1;
        }
        customer[i].T=customer[i].date*24*60+customer[i].hour*60+customer[i].minute;
    }
    qsort(customer,n,sizeof(customer[0]),cmp);
    for(i=0;i<n;i++)
    {
        if(i+1>=n)
            break;
        if(customer[i].tag==0&&customer[i+1].tag==1&&strcmp(customer[i].name,customer[i+1].name)==0)
        {
            if(flag==0)
           {
               strcpy(cname,customer[i].name);
               printf("%s %02d\n",cname,customer[i].month);
               flag=1;
               total=0;
           }
           if(strcmp(cname,customer[i].name)==0)
           {
               charge=caculate(customer[i+1].T)-caculate(customer[i].T);
             printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",customer[i].date,customer[i].hour,customer[i].minute,
                    customer[i+1].date,customer[i+1].hour,customer[i+1].minute,customer[i+1].T-customer[i].T,charge);
                    total+=charge;
           }
           else
           {
               printf("Total amount: $%.2lf\n",total);
               strcpy(cname,customer[i].name);
               printf("%s %02d\n",cname,customer[i].month);
               total=0;
               charge=caculate(customer[i+1].T)-caculate(customer[i].T);
             printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",customer[i].date,customer[i].hour,customer[i].minute,
                    customer[i+1].date,customer[i+1].hour,customer[i+1].minute,customer[i+1].T-customer[i].T,charge);
                    total+=charge;
           }
        }
    }
    printf("Total amount: $%.2lf",total);
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值