流量那些事儿

流量那些事儿

Problem Description

流量是大家都十分关心的事情,现在小暗接到了一个小任务,要写一个流量计费的系统,其中一个关于流量使用优先级的判断让他卡得很厉害,于是他来求助你帮他写。
已知流量使用优先级顺序:
省内流量包>全国流量包>套餐内省内流量>套餐内全国流量>套餐外流量(超出的流量)
用户初始只有套餐内流量,省内流量包(类型 1)和全国流量包(类型 2)需要订购才可拥有,而且可随时订购。流量包内包含流量数额和使用期限(即失效时间为订购时间 + 使用期限)
重复订购同一种流量包,若在该种流量包有效期内,流量可叠加,有效期顺延。
现在给出用户的一些操作,请你帮助小暗流量计费的计算。

Input

第一行输入用户所在省份、套餐内省内流量、套餐内全国流量,单位为 M,之间用空格隔开。
第二行输入可订购的流量包数量 n。
接下来有 n 行,每行输入一种流量包的信息:流量包类型、内含流量数额(单位为 M)、有效期(单位为天,天数 >= 1,如果为 -1 则是到使用到月底)
接下来输入一个整数,代表用户操作数 q。
之后每行输入一个操作:
U dd-hh:mm p x:在当月 dd 日 hm:mm:00 ~ hh:mm:59 期间,用户在 p 省使用流量 x B
B dd-hh:mm x:在当月 dd 日 hh:mm:00~hh:mm:59 期间,用户订购了流量包 x
Q dd-hh:mm x:在当月 dd 日 hh:mm:00~hh:mm:59 期间,用户查询指定流量包的余量信息
1 <= n <= 100
1 <= q <= 100
省份字符串长度不超过 20 个字节。
保证题中流量包内流量数额和用户总使用流量的计量单位最大为 G(不超过 1T)。
保证操作按照时间顺序输入,且不含相同的时间。时间均为当月内时间。默认一个月一共有 28 天。

Output

对于每次 Q 操作,在一行内输出流量信息,保留两位小数,单位为 M。
如果流量包已过期输出 0.00。
如果 x 为 0,在一行内输出餐内省内流量、套餐内全国流量、套餐外流量,之间以空格隔开。

Sample Input

Shandong 100 50
3
1 100 1
2 30 1
2 10 -1
16
U 1-12:00 Shandong 51200
Q 1-12:03 0
B 1-14:00 1
U 1-14:05 Zhejiang 1048576
Q 1-14:10 0
Q 1-14:10 1
B 1-15:00 2
U 1-15:05 Zhejiang 1048576
Q 1-15:11 2
B 2-10:00 2
U 2-17:45 Hebei 1048576
Q 2-18:58 1
Q 2-18:59 2
B 5-12:00 3
U 27-03:20 Guangdong 204800
Q 28-20:03 3

Sample Output

99.95 50.00 0.00
99.95 49.00 0.00
100.00
29.00
0.00
58.00
9.80

Hint

数据流量单位进制为 1024。
若在 dd-hh:mm 订购有效期为 x 天的流量包,则实际有效时间范围为 [dd-hh:mm, (dd+x)-hh:mm)。

Source

bLue

文中有两处细节描写的有些粗略,导致我并没有看明白,产生了歧义。
一个是流量可叠加,有效期顺延。
一个是用户查询指定流量包的余量信息。
这两个一组合,那到底还怎么询问,我能脑补出来不下三种方式。

代码是错的,但还是纪念一下码的最长的一个代码。以后再看说不定也就理解题意了。

#include <bits/stdc++.h>

using namespace std;

typedef struct node {
    int type;
    double date;
    int time;
} ty;

int main()
{
    int n,q,i;
    ty a[102];
    char pvence[22];
    double shengtao, guotao, waitao=0, tao1=0, tao2=0;
    int day1=0,hour1=0,minute1=0;  // 套餐一截止时间
    int day2=0,hour2=0,minute2=0; // 套餐二截止时间
    int day,hour,minute; //当前时间

    cin >> pvence >> shengtao >> guotao;
    cin >> n;
    for ( i=1; i<=n; i++ ) {
        cin >> a[i].type >> a[i].date >> a[i].time;
    }
    char isp;
    long long use;
    cin >> q;
    while ( q-- ) {
        cin >> isp;

        if ( isp=='U' ) {
            char nowplace[22];
            scanf("%d-%d:%d %s %lld",&day,&hour,&minute,nowplace,&use);
            double t = 1.0/1024;
            double nowuse = use*t*t;

            if ( strcmp(pvence,nowplace)==0 ) { // 是否在本省
                if ( day1>day || (day1==day&&hour1>hour) || (day1==day&&hour1==hour&&minute1>=minute) ) {  // 套餐一是否过期
                    if ( tao1>=nowuse ) { // 套餐1是否够用
                        tao1 -= nowuse;
                        nowuse = 0;
                    }
                    else {
                        tao1 = 0;
                        nowuse -= tao1;
                    }
                }
                if ( nowuse>0 ) {
                    if ( day2>day || (day2==day&&hour1>hour) || (day2==day&&hour2==hour&&minute2>=minute) ) {  // 套餐二是否过期
                        if ( tao2>=nowuse ) { // 套餐2是否够用
                            tao2 -= nowuse;
                            nowuse = 0;
                        }
                        else {
                            tao2 = 0;
                            nowuse -= tao2;
                        }
                    }
                }
                if ( nowuse>0 ) {
                    if ( shengtao>nowuse ) { // 省套是否够用
                        shengtao -= nowuse;
                        nowuse = 0;
                    }
                    else {
                        shengtao = 0;
                        nowuse -= shengtao;
                    }
                }
                if ( nowuse>0 ) {
                    if ( guotao>nowuse ) { // 国套是否够用
                        guotao -= nowuse;
                        nowuse = 0;
                    }
                    else {
                        guotao = 0;
                        nowuse -= guotao;
                    }
                }
                if ( nowuse>0 ) { // 流量外
                    waitao += nowuse;
                }
            }
            else {
                if ( nowuse>0 ) {
                    if ( day2>day || (day2==day&&hour1>hour) || (day2==day&&hour2==hour&&minute2>=minute) ) {  // 套餐二是否过期
                        if ( tao2>=nowuse ) { // 套餐2是否够用
                            tao2 -= nowuse;
                            nowuse = 0;
                        }
                        else {
                            tao2 = 0;
                            nowuse -= tao2;
                        }
                    }
                }
                if ( nowuse>0 ) {
                    if ( guotao>nowuse ) { // 国套是否够用
                        guotao -= nowuse;
                        nowuse = 0;
                    }
                    else {
                        guotao = 0;
                        nowuse -= guotao;
                    }
                }
                if ( nowuse>0 ) { // 流量外
                    waitao -= nowuse ;
                }
            }
        }
        else if ( isp=='B' ) {
            int cnt;
            scanf("%d-%d:%d %d",&day,&hour,&minute,&cnt);
            int isp = a[cnt].type;
            if ( isp==1 ) { // 判断订购了套餐几
                if ( day1>day || (day1==day&&hour1>hour) || (day1==day&&hour1==hour&&minute1>=minute) ) { // 之前订购的此套餐是否过期
                    tao1 += a[cnt].date;
                    if ( a[cnt].time==-1 ) {
                        a[cnt].time = 28;
                    }
                    day1 += a[cnt].time;
                }
                else {
                    tao1 = a[cnt].date;
                    if ( a[cnt].time==-1 ) {
                        a[cnt].time = 28;
                    }
                    day1 = day + a[cnt].time;
                    hour1 = hour;
                    minute1 = minute;
                }
            }
            else if ( isp==2 ) {
                if ( day2>day || (day2==day&&hour2>hour) || (day2==day&&hour2==hour&&minute2>=minute) ) { // 之前订购的此套餐是否过期
                    tao2 += a[cnt].date;
                    if ( a[cnt].time==-1 ) {
                        a[cnt].time = 28;
                    }
                    day2 += a[cnt].time;
                }
                else {
                    tao2 = a[cnt].date;
                    if ( a[cnt].time==-1 ) {
                        a[cnt].time = 28;
                    }
                    day2 = day + a[cnt].time;
                    hour2 = hour;
                    minute2 = minute;
                }
            }
        }
        else if (  isp=='Q') {
            int cnt,isp;
            scanf("%d-%d:%d %d",&day,&hour,&minute,&cnt);
            if ( cnt==0 ) {
                isp = 0;
            }
            else {
                isp = a[cnt].type;
            }

            if ( day1>day || (day1==day&&hour1>hour) || (day1==day&&hour1==hour&&minute1>=minute) ) { // 之前订购的此套餐是否过期

            }
            else {
                tao1 = 0;
            }
            if ( day2>day || (day2==day&&hour2>hour) || (day2==day&&hour2==hour&&minute2>=minute) ) { // 之前订购的此套餐是否过期

            }
            else {
                tao2 = 0;
            }

            if ( isp==0 ) {
                printf("%.2f %.2f %.2f\n",shengtao,guotao,waitao);
            }
            else if ( isp==1 ) {
                printf("%.2f\n",tao1);
            }
            else if ( isp==2 ) {
                printf("%.2f\n",tao2);
            }
        }
    }

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值