看难度就明白这是道签到题
1.思路
题目要求我们将所有板子 ** 放过 ** 就行,但放入金就会清空银。
所以我们要在放金之前 ** 尽可能多放银 **。
这就是标签所说的贪心。
2.解法
由以上思路可得:
放银的数目依次为 z−1、z−2 ... z−x。
由等差数列公式:
最多可以放 2x∗(z−x+z−1) 个银,令该式子为 σ。
我们得到如下几种情况:
- x 恰好满足放入所有 y 后 x 被清空。
- x 恰好满足放入所有 y 后 x 被清空不足。
- x 恰好满足放入所有 y 后 x 被清空有余。
而这三种情况依次对应 =σ、<σ、>σ 的情况。
分别为 $case1\ $ $case2\ $ $case3 $
case1: 显然满足要求。
case2: 翻译过来就是金放完了银有剩,则只需要剩下的银数量 小于等于 可放位置的数量就行了。
case3: 银放完了金有剩,具体剩多少呢?
我们令此时消耗的金数量为 x0 则将 x0 带入 σ 式。
整理一下得到关于 x0 的式子:
x02−(2z−1)x0+2y=0。
得到:x0=⌊22z−1+(2z−1)2−8y⌋。
同 case2 理即可求解。
3.Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include<bits/stdc++.h> using namespace std; typedef long long ll; ll T,x,y,z; int main(){ scanf("%lld",&T); while(T--){ scanf("%lld%lld%lld",&x,&y,&z); if(x>z){printf("Merry\n");continue;} ll judge=x*(2*z-x-1)/2; if(judge==y){printf("Renko\n");continue;} if(judge<y&&(y-judge<=z-x)){printf("Renko\n");continue;} int x0=(2*z-1+sqrt((2*z-1)*(2*z-1)-8*y))/2; if(judge>y&&(x-x0)<=z){printf("Renko\n");continue;} printf("Merry\n"); } return 0; }
|