看难度就明白这是道签到题

1.思路

题目要求我们将所有板子 ** 放过 ** 就行,但放入金就会清空银。
所以我们要在放金之前 ** 尽可能多放银 **。
这就是标签所说的贪心。

2.解法

由以上思路可得:
放银的数目依次为 z1z-1z2z-2 ...... zxz-x
由等差数列公式:
最多可以放 x(zx+z1)2\frac{x*(z-x+z-1)}{2} 个银,令该式子为 σ\sigma
我们得到如下几种情况:

  • xx 恰好满足放入所有 yyxx 被清空。
  • xx 恰好满足放入所有 yyxx 被清空不足。
  • xx 恰好满足放入所有 yyxx 被清空有余。

而这三种情况依次对应 =σ=\sigma<σ<\sigma>σ>\sigma 的情况。
分别为 $case1\ $ $case2\ $ $case3 $
case1case1: 显然满足要求。
case2case2: 翻译过来就是金放完了银有剩,则只需要剩下的银数量 小于等于 可放位置的数量就行了。
case3case3: 银放完了金有剩,具体剩多少呢?
我们令此时消耗的金数量为 x0x_0 则将 x0x_0 带入 σ\sigma 式。
整理一下得到关于 x0x_0 的式子:
x02(2z1)x0+2y=0x_0^2-(2z-1)x_0+2y=0
得到:x0=2z1+(2z1)28y2x_0=\lfloor\frac{2z-1+\sqrt[]{(2z-1)^2-8y}}{2}\rfloor
case2case2 理即可求解。

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;
}