1 条题解

  • 1
    @ 2025-11-25 19:44:38

    我叶梓楣也要成为duck大魔王!!!(完)

    题意

    Eve 准备了 a1+a2+a3+a4a1+a2+a3+a4 个笑话,按类型分组如下:

    • 类型 1:Alice 和 Bob 都喜欢;
    • 类型 2:Alice 喜欢,但 Bob 不喜欢;
    • 类型 3:Bob 喜欢,但 Alice 不喜欢;
    • 类型 4:Alice 和 Bob 都不喜欢。

    给了四种类型的数量 如果心情小于0 那么就有人走 问有人离开之前 最多能说多少场

    思路:

    1. 先讲完所有类型 1 的笑话,此时 Alice 与 Bob 的心情值都提升到 **a1,计入答案 `ans = a1
    2. 类型 2 与类型 3 可以成对出现(顺序选好即可),互相抵消对心情的影响,每对贡献 2 个笑话:pair = min(a2, a3),答案加 2 * pair,讲完后两人心情仍是 a1
    3. 余下的只会是单边喜欢的笑话 **diff = |a2 - a3|(只会影响其中一人)和都不喜欢的类型 4(同时影响两人)。
      • 无论是这一剩余的单边笑话还是类型 4,都会让“较弱”的那位心情减 1。
      • 由于此时两人的可用“缓冲”正好是 a1,因此还能再承受至多 a1 次这样的削弱保持心情非负,再多一次(第 a1 + 1 次)会让那位心情变成 -1,也计数但演出结束。
      • 所以这一阶段最多还能讲 **a1 + 1 个笑话,而可供使用的笑话总数是 diff + a4。取二者较小并加入答案。
    4. 特殊情况:若 a1 == 0,无法先建立缓冲,无论讲哪种笑话都会立刻让某人心情为负,因此答案恒为 1(至少能讲出一则)。
    #include<bits/stdc++.h>
     using namespace std;
     #define int long long
     #define endl '\n'
     #define EPS 1e-8
     #define lowbit(x) x&(-x)
     const int inf = 0x3f3f3f3f;
     typedef pair<int,int> pii;
     void solve()
     {
         int a,b,c,d;
         cin>>a>>b>>c>>d;
     ​
         if(a==0)
         {
             cout<<1<<endl;
             return ;
         }
         int ans=0;
         ans+=a; 
         ans+=2*min(b,c);
         ans+=min(a+1,abs(b-c)+d);
         cout<<ans<<endl;
     ​
     }
     signed main() 
     {
         ios::sync_with_stdio(false);
         cin.tie(0);
         cout.tie(0);
         int t=1;
         cin>>t;
         while(t--)
         {
             solve();
         }
         return 0;
     }
    

    我叶梓楣也要成为duck大魔王!!!(完)

    信息

    ID
    1219
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    135
    已通过
    28
    上传者