HDU 5037 Frog(贪心)
2015-09-24 11:05
253 查看
题意比较难懂,一只青蛙过河,它最多一次跳L米,现在河中有石头,距离不等,上帝可以往里加石头,青蛙非常聪明,它一定会选择跳的次数最少的路径。问怎么添加石头能让青蛙最多的次数。输出青蛙跳的最多的次数。
考虑对于长度L+1,上帝一定会让青蛙跳两次。那么只需要尽可能的构造L+1就行了。那么就需要求多少个L+1就行了。还有就是需要记录上一次跳的距离,如果上一次跳的距离加上这次的距离小于L+1的话,那么上次一定会跳到当前这个点,而不是跳到上次那个点,所以更新一下上次的距离。也就是这两种情况:
1)上一步pre加这一步余数y大于L,则最后剩余部分需要单独跳;
2)上一步pre加这一步余数y小于等于L,最后剩余部分可以并进上一步,即pre+y。
代码如下:
考虑对于长度L+1,上帝一定会让青蛙跳两次。那么只需要尽可能的构造L+1就行了。那么就需要求多少个L+1就行了。还有就是需要记录上一次跳的距离,如果上一次跳的距离加上这次的距离小于L+1的话,那么上次一定会跳到当前这个点,而不是跳到上次那个点,所以更新一下上次的距离。也就是这两种情况:
1)上一步pre加这一步余数y大于L,则最后剩余部分需要单独跳;
2)上一步pre加这一步余数y小于等于L,最后剩余部分可以并进上一步,即pre+y。
代码如下:
#include <cstdio> #include <algorithm> using namespace std; const int maxn = 2 * 1e5 + 10; int a[maxn]; int main() { int T, n, m, L, kase = 0; scanf("%d", &T); while (T--) { scanf("%d %d %d", &n, &m, &L); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); a[0] = 0; a[++n] = m; sort(a, a + n); int ans = 0, pre = L; for (int i = 1; i <= n; i++) { int x = (a[i] - a[i - 1]) / (L + 1); int y = (a[i] - a[i - 1]) % (L + 1); if (y + pre >= L + 1) { pre = y; ans += 2 * x + 1; } else { pre = pre + y; ans += 2 * x; } } printf("Case #%d: %d\n", ++kase, ans); } return 0; }
相关文章推荐
- 通过Nuget添加Mvvmlight框架发生错误
- hdu3037 Saving Beans(个数可为0的特殊“插板法”+推公式+组合数取摸(需预处理素数阶乘,否则TLE))
- 部署Tectonic服务到kubernetes集群
- XCode 7上传遇到ERROR ITMS-90535 Unexpected CFBundleExecutable Key. 的解决办法
- Spring管理事务实现方式
- Spinner初始化不触发onItemSelected
- java学习笔记网络编程
- XML文件读取之 DOM解析操作
- Python的getattr(),setattr(),delattr(),hasattr()
- 读取位置 0x00000028 时发生访问冲突该怎么解决
- 检测耳机是否插入方法
- 【Unity3D游戏开发学习笔记】(二)Unity3D编辑器总览
- 利用社会关系进行微博情感分析(A10, WSDM2013)
- Runtime运行时动态加载模型属性
- 匿名内部类练习
- html添加网络音乐
- Swift学习-集合类型(四)
- shadow$_monitor_和shadow$_klass_
- 从头开始实现神经网络——入门
- MYSQL查询优化(二)