P8344「Wdoi-6」走在夜晚的莲台野-题解
看难度就明白这是道签到题
1.思路
题目要求我们将所有板子 放过 就行,但放入金就会清空银。
所以我们要在放金之前 尽可能多放银。
这就是标签所说的贪心。
2.解法
由以上思路可得:
放银的数目依次为 \(z-1\)、\(z-2\) \(...\) \(z-x\)。
由等差数列公式:
最多可以放 \(\frac{x*(z-x+z-1)}{2}\) 个银,令该式子为 \(\sigma\)。
我们得到如下几种情况:
- \(x\) 恰好满足放入所有 \(y\) 后 \(x\) 被清空。
- \(x\) 恰好满足放入所有 \(y\) 后 \(x\) 被清空不足。
- \(x\) 恰好满足放入所有 \(y\) 后 \(x\) 被清空有余。
而这三种情况依次对应 \(=\sigma\)、\(<\sigma\)、\(>\sigma\) 的情况。
分别为 $case1\ $ $case2\ $ \(case3\)。
\(case1\): 显然满足要求。
\(case2\): 翻译过来就是金放完了银有剩,则只需要剩下的银数量 小于等于 可放位置的数量就行了。
\(case3\): 银放完了金有剩,具体剩多少呢?
我们令此时消耗的金数量为 \(x_0\) 则将 \(x_0\) 带入 \(\sigma\) 式。
整理一下得到关于 \(x_0\) 的式子:
\(x_0^2-(2z-1)x_0+2y=0\)。
得到:\(x_0=\lfloor\frac{2z-1+\sqrt[]{(2z-1)^2-8y}}{2}\rfloor\)。
同 \(case2\) 理即可求解。
3.Code
#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;
}