HDU Problem 4004 The Frog's Games 【二分】
2016-07-27 21:27
330 查看
The Frog's Games
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 6176 Accepted Submission(s): 3010
[align=left]Problem Description[/align]
The annual Games in frogs' kingdom started again. The most famous game is the Ironfrog Triathlon. One test in the Ironfrog Triathlon is jumping. This project requires the frog athletes to jump over the river. The width of the river
is L (1<= L <= 1000000000). There are n (0<= n <= 500000) stones lined up in a straight line from one side to the other side of the river. The frogs can only jump through the river, but they can land on the stones. If they fall into the river, they
are out. The frogs was asked to jump at most m (1<= m <= n+1) times. Now the frogs want to know if they want to jump across the river, at least what ability should they have. (That is the frog's longest jump distance).
[align=left]Input[/align]
The input contains several cases. The first line of each case contains three positive integer L, n, and m.
Then n lines follow. Each stands for the distance from the starting banks to the nth stone, two stone appear in one place is impossible.
[align=left]Output[/align]
For each case, output a integer standing for the frog's ability at least they should have.
[align=left]Sample Input[/align]
6 1 2
2
25 3 3
11
2
18
[align=left]Sample Output[/align]
4
11
青蛙想跳过长为L的河面,河上有n块石头,他们想只跳过m个石头。利用二分吗,寻找最优解。
#include <cstdio> #include <cmath> #include <algorithm> #define MAX_N 500050 using namespace std; const double ESP = 1e-5; const int INF = 1e8; int stone[MAX_N]; int L, m, n; bool judge(int x) { int last = 0; int cnt = 0; for (int i = 0; i <= n; ) { if (last + x >= stone[i]) { i++; } else { if (last == stone[i - 1] || i == 0) return false; last = stone[i - 1]; cnt++; } } cnt++; return cnt <= m; } int main() { while (scanf("%d%d%d", &L, &n, &m) != EOF) { for (int i = 0; i < n; i++) { scanf("%d", &stone[i]); } sort(stone, stone + n); int l = 0, r = L, mid, ans; stone = L; for (int i = 0; i < 100; i++) { mid = (l + r)/2; if (judge(mid)) { ans = mid; r = mid - 1; } else l = mid + 1; } printf("%d\n", ans); } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002