hdu 4004 (二分加贪心) 青蛙过河

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4004

题目意思是青蛙要过河,现在给你河的宽度,河中石头的个数(青蛙要从石头上跳过河,这些石头都是在垂直于河岸的一条直线上)

还有青蛙能够跳跃的 最多 的次数,还有每个石头离河岸的距离,问的是青蛙一步最少要跳多少米可以过河》

这是一道二分加贪心的题,从0到的河宽度开始二分,二分出一个数然后判断在这样的最小步数(一步跳多少距离)下能否过河

判断的时候要贪心

主要难在思维上,关键是要想到二分上去,能想到二分code就很好写了(实验二分的思维还是很强大的)

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 //typedef long long ll;
 5 int l,n,m;
 6 int num[500001];
 7 int check(int x)
 8 {
 9     if (x*m<l) return 1; //能过河的步数必然是大于平均值的
10     int i=1,j=0,step=0;
11     while (i<=n+1)
12     {
13         step++;
14         if (num[i]-num[j]>x) //不能满足相邻的两个石头之间的跳跃显然是不行的
15             return 1;
16         while (num[i]-num[j]<=x&&i<=n+1)//尽量使这一步能跳过更多的石头,贪心基本上都是这个格式
17             i++;
18         j=i-1;
19     }
20     if (step>m)  return 1; //判断是否超过规定的次数
21     return 0;
22 }
23 int main()
24 {
25     int left,right,i,mid;
26     while (~scanf("%d %d %d",&l,&n,&m))
27     {
28         for (i=1;i<=n;i++)
29            scanf("%d",&num[i]);
30         sort(num+1,num+1+n);
31         num[0]=0;num[n+1]=l;
32         left=0;right=l;
33         while (left<=right) //二分出最小步数
34         {
35             mid=(left+right)/2;
36             if (check(mid))
37                 left=mid+1;
38             else
39                 right=mid-1;
40         }
41         printf("%d\n",left);
42     }
43     return 0;
44 }
时间: 2025-01-06 12:33:15

hdu 4004 (二分加贪心) 青蛙过河的相关文章

hdu 4004(二分)

题意:一直青蛙过河,河宽l米,上面有n个石头,给出每个石头的位置,然后要求最多m步跳过去,问他最小最远一步可以跳多远. 题解:最小的最大值的计算用二分,二分出距离然后拿去判断,在这个距离内贪心的跳,判断能否跳到对岸. #include <stdio.h> #include <algorithm> using namespace std; const int N = 500005; int l, n, m, sto[N]; bool judge(int x) { int k = 0,

hdu 4004 二分 2011大连赛区网络赛D

题意:一个长为L的河,中间有n个石子,小青蛙需要跳少于m次过河,判断小青蛙每次跳跃最大距离的最小值 最大值最小,用二分 Sample Input 6 1 2 2 25 3 3 11 2 18 Sample Output 4 11 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include

HDU 5652 二分加搜索 http://acm.split.hdu.edu.cn/showproblem.php?pid=5652

Problem Description A long time ago there are no himalayas between India and China, the both cultures are frequently exchanged and are kept in sync at that time, but eventually himalayas rise up. With that at first the communation started to reduce a

二分加贪心

版权声明:Vici__ https://blog.csdn.net/Vici__/article/details/82951744题意:给出n个冰淇淋球,做一个冰淇淋需要k个冰淇淋球,要求相邻的两个球:下面的球的质量大于等于其上面的那个球质量的两倍. 给出n个数(n个冰淇淋球的质量),求最多能做几个冰淇淋. 题解:n个冰淇淋球,做一个冰淇淋需要k个冰淇淋球,则最多可做n/k个,二分可做数,然后检验(贪心). 二分答案:left = 0,right = n / k:贪心检验:假设能做x个,这x个冰

Codeforces 551C - GukiZ hates Boxes(二分加贪心)

题意: 就是n个学生帮助教授搬箱子, 箱子分成m 堆, 每个学生每秒可以选择的两个操作 操作1,为从i堆迈向第i+1堆, 操作2,从i-1堆箱子中帮忙抱走一个箱子 问抱走所有箱子的最少时间为多少, 每个学生每秒可以同时行动 题解: 二分时间   然后再当前时间下,一个一个派出所有的学生,使其走到他能走的最远距离 代码: #include<stdio.h> int flag, value[100005], value2[100005], n, m; void find(long long int

HDU 4004 The Frog&#39;s Games(基本算法-贪心,搜索-二分)

The Frog's Games Problem Description 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

HDU 4004 The Frog&#39;s Games 二分 贪心

戳这里:HDU 4004 //思路:二分经典入门题...贪心判方案是否可行 1 #include "bits/stdc++.h" 2 using namespace std; 3 int L, n, m; 4 int pos[500010], dis[500010]; 5 6 bool Cant(int Dis_Jump) 7 { 8 int i, Dis_Sum = 0, Count = 0; 9 for(i = 1; i <= n + 1; ++i) { 10 if(dis[

HDU 4004 The Frog&#39;s Games(二分答案)

The Frog's Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 10307    Accepted Submission(s): 4686 Problem Description The annual Games in frogs' kingdom started again. The most famous game

hdu 4004 The Frog&#39;s Games【二分】

The Frog's Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 3980    Accepted Submission(s): 1931 Problem Description The annual Games in frogs' kingdom started again. The most famous game