信之惊喜值

文章讨论了如何根据拆信过程中的信封、信纸面积和礼物质量计算ZYL的惊喜值,涉及规则包括初始值、无礼物的递减、有礼物的加成和翻倍机制。
摘要由CSDN通过智能技术生成

[语言月赛202306] 信

题目描述

信是具有重量的。信封有重量,信纸也有重量。由于信封和信纸都很薄,我们认为每平方厘米信封的重量为 x x x 毫克,每平方厘米信纸的重量为 y y y 毫克。 此外,有的信封中还会有一些礼物,这些礼物一定有重量。

zyl 收到了 n n n 封信,他能精确测量出每封信中信封的面积 S S S(单位:平方厘米)、信纸的面积 s s s(单位:平方厘米)以及整封信的重量 M M M(单位:毫克),保证这三个数据都是整数。在拆开信件的过程中,他会按照如下规则积累惊喜值(初始时惊喜值为 0 0 0):

  • 如果信封没有任何礼物(即信封中礼物重量为 0 0 0),他的惊喜值不变。但是,如果连续 b b b 封及以上的信里都没有礼物,则从第 b b b 封信开始,每拆开一封没有礼物的信,zyl 的惊喜值都会减半,然后向下取整,直到拆开一封有礼物的信。如果惊喜值原本即为 0 0 0,则不会变化。
  • 如果信封里有礼物,设礼物的质量为 M ′ M' M 毫克,则 zyl 的惊喜值会增加 M ′ M' M。如果礼物的质量大于信封和信纸的总质量,则会额外增加 0.5   M ′ 0.5\ M' 0.5 M,然后向上取整。如果连续 a a a 封及以上的信里有礼物,则从第 a a a 封信开始,每拆开一封有礼物的信,zyl 的惊喜值都会在计算完这次本身的加成后再乘 2 2 2,直至拆开一封没有礼物的信。

现在按照 zyl 拆信的顺序给出 n n n 封信的信息,请你求出 zyl 在拆信过程中最高的惊喜值和最终的惊喜值。

输入格式

输入共 n + 1 n+1 n+1 行。

第一行五个整数 n , x , y , a , b n,x,y,a,b n,x,y,a,b,含义如题所示。
接下来 n n n 行,每行三个整数 S , s , M S,s,M S,s,M。表示这封信的信封面积,信纸面积和总质量,单位分别为平方厘米
、平方厘米、毫克。

输出格式

输出共一行两个整数,第一个表示拆信过程中的最高惊喜值,第二个表示最终的惊喜值,二者之间使用空格隔开。

样例 #1

样例输入 #1

6 1 1 2 2
5 3 10
6 2 12
2 3 5
2 3 11
3 5 8
2 2 4

样例输出 #1

21 10

提示说明

样例 1 解释

惊喜值的变化如下表:

信的序号礼物重量惊喜值增加额外增加是否折半是否翻倍惊喜值
1 2 2 2 2 2 2 0 0 0 2 2 2
2 4 4 4 4 4 4 0 0 0 12 12 12
3 0 0 0 0 0 0 0 0 0 12 12 12
4 6 6 6 6 6 6 3 3 3 21 21 21
5 0 0 0 0 0 0 0 0 0 21 21 21
6 0 0 0 0 0 0 0 0 0 10 10 10

最高的惊喜值为 21 21 21,最终的惊喜值为 10 10 10

数据规模与约定

对于 40 % 40\% 40% 的数据, n ≤ 1000 n\leq 1000 n1000,任意时刻的惊喜值不会超过 1 0 9 10^{9} 109
对于另外 20 % 20\% 20% 的数据, a = b = n a=b=n a=b=n
对于 100 % 100\% 100% 的数据, 1 ≤ a , b ≤ n ≤ 1 0 6 1\leq a,b\leq n\leq 10^{6} 1a,bn106 1 ≤ x , y ≤ 20 1\leq x,y\leq 20 1x,y20 1 ≤ S , s ≤ 500 1\leq S,s\leq 500 1S,s500 x × S + y × s ≤ M ≤ 1 0 5 x\times S+y\times s\leq M\leq 10^{5} x×S+y×sM105,任意时刻的惊喜值不会超过 1 0 18 10^{18} 1018

代码内容

// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll N=1e6+10;
ll arr[N];

int main()
{
    ll n,x,y,a,b;
    cin>>n>>x>>y>>a>>b;

    ll S,s,M;
    ll res,ans;
    res=ans=0;
    for(ll i=1;i<=n;i++)
    {
        ll value,m;
        cin>>S>>s>>M;
        
        m=S*x+s*y;
        value=M-m;

        if(!value)
        {
            res++;
            ans=0;

            arr[i]=arr[i-1];
            if(res>=b)
                arr[i]=arr[i-1]/2;
        }
        else
        {
            ans++;
            res=0;
            
            if(value>m)
                value=ceil(value*1.5);

            arr[i]=arr[i-1]+value;
            if(ans>=a)
                arr[i]*=2;
        }
    }

    ll maxn=0;
    for(ll i=1;i<=n;i++)
        maxn=max(maxn,arr[i]);
    
    cout<<maxn<<" "<<arr[n];
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pretty Boy Fox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值