码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4004 二分

时间:2015-02-11 18:01:07      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:

题意:一个长为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<queue>
 7 using namespace std;
 8 const int maxn=500010;
 9 int n,m,t,L;
10 int d[maxn];
11 bool fun(int x) //判断青蛙跳x的时候需要跳几次过河,贪心,每次选择能跳最远的
12 {
13     int now=0,tot=0;
14     int cnt=0;
15     while(now<L)
16     {
17         now+=x;
18         while(now>=d[tot])   tot++;
19         now=d[tot-1];
20         cnt++;
21     }
22     if(cnt<=m)  return true;
23     else return false;
24 }
25 int main()
26 {
27     int i,j,k;
28     //freopen("1.in","r",stdin);
29     while(scanf("%d%d%d",&L,&n,&m)!=EOF)
30     {
31         for(i=1;i<=n;i++)   scanf("%d",&d[i]);
32         sort(d+1,d+n+1);
33         d[0]=0;
34         d[n+1]=L;
35         d[n+2]=100000001;   //用来判断跳几次过河的边界
36         int l=0,r=L,mid;
37         int ans;    //记录最小值
38         for(i=1;i<=n+1;i++) l=l<d[i]-d[i-1]?d[i]-d[i-1]:l;  //求出两个相邻石子之间的最大距离,也就是青蛙要跳的最小距离
39         while(l<=r)
40         {
41             mid=(l+r)>>1;
42             if(fun(mid))    ans=mid,r=mid-1;
43             else l=mid+1;
44         }
45         printf("%d\n",ans);
46     }
47 }

 

hdu 4004 二分

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4286470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!