zoukankan      html  css  js  c++  java
  • UVa145 Gondwanaland Telecom

    Time limit: 3.000 seconds
    限时:3.000秒

     

    Problem
    问题

    Gondwanaland Telecom makes charges for calls according to distance and time of day. The basis of the charging is contained in the following schedule, where the charging step is related to the distance:
    冈瓦纳电信公司依照一天中的时段和通话距离来收取话费。下表列出了基本通话费方案。当中话费阶段是按距离远近安排的。

     

    Charging Step
    (distance)
    Day Rate
    8am to 6pm
    Evening Rate
    6pm to 10pm
    Night Rate
    10pm to 8am
    A 0.10 0.06 0.02
    B 0.25 0.15 0.05
    C 0.53 0.33 0.13
    D 0.87 0.47 0.17
    E 1.44 0.80 0.30

     

    All charges are in dollars per minute of the call. Calls which straddle a rate boundary are charged according to the time spent in each section. Thus a call starting at 5:58 pm and terminating at 6:04 pm will be charged for 2 minutes at the day rate and for 4 minutes at the evening rate. Calls less than a minute are not recorded and no call may last more than 24 hours.
    全部话费都是依照通话的分钟数累计的。

    若一次通话跨越了两个时段,则分别依照在各时段内的通话时间和费率进行收费。比方一次通话由晚5:58開始到晚6:04结束,则按2分钟的白天通话和4分钟的夜晚通话费率计算。通话少于1分钟的不计费,最长的通话不会超过24小时。

    Write a program that reads call details and calculates the corresponding charges.
    写一个程序读取全部的通话信息并计算相应的话费。

     

    Input and Output
    输入与输出

    Input lines will consist of the charging step (upper case letter 'A'..'E'), the number called (a string of 7 digits and a hyphen in the approved format) and the start and end times of the call, all separated by exactly one blank. Times are recorded as hours and minutes in the 24 hour clock, separated by one blank and with two digits for each number. Input will be terminated by a line consisting of a single #.
    输入由多行组成。每一行数据都包含:话费阶段(大写字母“A”到“E”),拨出的号码(一个7位数组和横线组成的字符串),通话的開始和结束时间。这些数据间都由空格隔开。

    时间均由24小时制的小时和分钟表示。之间由一个空格隔开,每一个数字都有两位数(译注:不足两位的前面补零)。仅仅有一个#号的单独一行表示输入结束。

    Output will consist of the called number, the time in minutes the call spent in each of the charge categories, the charging step and the total cost in the format shown below.
    输出的每一行要包含拨出的号码,每个话费阶段的分钟数。话费阶段编号以及总费用。并按例如以下格式输出。

     

    Sample Input
    输入演示样例

    A 183-5724 17 58 18 04
    #

     

    Sample Output
    输出演示样例

    0         10        20        30
    123456789012345678901234567890123456789

      183-5724     2     4     0  A    0.44

    译注:原文中的演示样例输出为一张非常不清晰的图片。上面的数据来自我AC的程序输出,格式与原图全然同样。最上面灰色的两行为表头表示字符的位置,仅仅作演示样例參照,你的程序不要输出该表头

    红色的数字表示以下一列数据须要对齐的位置(在以下一列的左側为左对齐。在右側为右对齐)。

    这题一開始想的很复杂,这题有两个注意点,一是要可以处理跨凌晨0点的问题。二是假设開始时间和结束时间相等的话,那么算通话一天。!

    。(就是由于这一点,我一直没AC,f**k)


    我的代码例如以下:

    #include<iostream>
    #include<stdio.h>
    typedef struct price{
        char step;
        double a;
        double b;
        double c;
    }price;
    price s[5]={
        {'A',0.10,0.06,0.02 },
        {'B',0.25,0.15,0.05},
        {'C',0.53,0.33,0.13},
        {'D',0.87,0.47,0.17},
        {'E',1.44,0.80,0.30}};
    char phone_number[8];
    char tt;
    int sh,sm,eh,em;
    int startindex;
    int endindex;
    int a,b,c;
    inline double getprice(int i,int index)
    {
        //printf(" %d
    ",i);
        if(i<=480){c++;return s[index].c;}
        if(480<i&&i<=1080){a++;return s[index].a;}
        if(1080<i&&i<=1320){b++;return s[index].b;}
        if(i>1320){c++;return s[index].c;}
    }
    int main(int argc, char *argv[])
    {
        //freopen("1.in","r",stdin);
        scanf("%c",&tt);
        while(tt!='#'){
            char cc=tt;
            scanf("%s",phone_number);
            scanf("%d %d %d %d",&sh,&sm,&eh,&em);
            a=b=c=0;
            int index=0;
            for(;index<5;++index)
            {
                if(s[index].step==cc)
                    break;
            }
            int E=eh*60+em;
            int S=sh*60+sm;
            double sum=0;
            if(S<E){
                for(int i=S+1;i<=E;++i)
                {
                    sum+=getprice(i,index);
                }
            }
            else if(S==E)
            {
                for(int i=S+1;i<=1440;++i)
                    sum+=getprice(i,index);
                for(int i=1;i<=E;++i)
                    sum+=getprice(i,index);
            }
            else
            {
                for(int i=S+1;i<=1440;++i)
                    sum+=getprice(i,index);
                for(int i=1;i<=E;++i)
                    sum+=getprice(i,index);
            }
            printf("%10s%6d%6d%6d%3c%8.2lf
    ", phone_number, a, b,c, cc, sum);
            scanf("
    %c",&tt);
        }
        return 0;
    }
    


  • 相关阅读:
    css伪类和伪对象
    多浏览器css兼容分析小结
    Hibernate3源码分析之hibernate.cfg.xml配置文件与SessionFactory类
    php示例代码之使用mysqli对象
    C#中Web Service身份验证
    未能转换为类型库。类型库导出程序在处理,时遇到了错误。错误: 找不到元素
    MS RDLC reportview 在 Chrome中不显示查询结果的原因
    C# 创建ActiveX
    How to rebuild performance counters on Windows Vista/Server2008/7/Server2008R2
    jqGrid中文说明文档——选项设置
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6780144.html
Copyright © 2011-2022 走看看