P8344 题解
2022/8/26 6:24:49
本文主要是介绍P8344 题解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
### 前言
题目传送门
\(\color{red}{see}\space \color{green}{in}\space \color{blue}{my}\space \color{purple}{blog}\)
这题作为本次比赛的 T1,难度感觉还行,算是一道结论题。
已经尽量讲得简单一些,没有用复杂的求和符号。
思路
很容易想到贪心策略,如下。
第 \(1\) 次放 \((z-1)\) 块银色木板,再放一块金色木板。
第 \(2\) 次放 \((z-2)\) 块银色木板,再放一块金色木板。
一直按照这个规律下去放木板,直到放完第 \(x\) 次。
注意,还有第 \((x+1)\) 次,这一步执行时已经没有金色木板了,但可以将剩下的空位都塞满银色木板,可以塞 \((z-x)\) 块。
因此,我们最终需要判断:\((z-1) + (z-2) + \cdots + (z-x) + (z-x)\) 是否大于等于 \(y\)。
循环暴力累加,时间复杂度是线性的,但我们需要让时间达到 \(O(1)\)。
化简这个算式即可: \((z-1) + (z-2) + \cdots + (z-x) + (z-x)\)。
\(\begin{aligned}\text{原式} &= (x+1) \cdot z - (1 + 2 + \cdots + x + x)\\&= (x+1)\cdot z - \left[ \dfrac{(x+1)\cdot x}{2} + x \right]\end{aligned}\)
这就是本题结论了。
坑点
切记开 long long
。
开始时还需要判断一下,如果 \(x > z\) 就必定无解。
完整代码
#include <iostream> #include <cstdio> using namespace std; bool solve() { long long x, y, z; scanf("%lld%lld%lld", &x, &y, &z); if (x > z) return false; return ((x+1) * z - (x * (x+1) / 2 + x) >= y); } int main() { int T; scanf("%d", &T); while (T--) { bool t = solve(); if (t) puts("Renko"); else puts("Merry"); } return 0; }
首发:2022-05-17 17:37:47
这篇关于P8344 题解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南