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;
} 
posted @ 2022-06-06 17:26  ThinkGone  阅读(47)  评论(0编辑  收藏  举报