首页 > 其他 > 详细

跳石头

时间:2019-08-20 13:49:49      阅读:55      评论:0      收藏:0      [点我收藏+]

【timegate】

https://www.luogu.org/problem/P2678

【解题思路】

题目的意思很简单,就是最多移走m块石头,使得选手跳跃的最短距离最大即可。

本人暴力枚举的时候,自己编译时,发现只有样例过了,自己编的数据一个都没过(内心有点酸~~~),后来才发现其实是可以二分答案的,原因是题目要求找到最短距离的最大值,这种题目用二分做最合适。

主要思路 :从起点出发,先选定一段距离mid,若前面的石头B与你所站着的石头A的距离小于mid,就把B搬掉,记录一下;如果不,就把B留下,再跳到石头B上。照这个步骤多次循环后,如果搬掉的石头多了,就把距离mid定小点;如果少了,就把mid定大点。

【code】

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int i,L,l,r,n,m,mid,ans,a[50005];
 5 bool check(int x){
 6     int cnt=0;
 7     ans=0;
 8     for(i=1;i<=n;i++){
 9         if(a[i]-a[cnt]<x)ans++;
10         else cnt=i;
11     }
12     return ans>m?false:true;
13 }
14 int main(){
15     //freopen("jump.in","r",stdin);
16     //freopen("jump.out","w",stdout);
17     scanf("%d%d%d",&L,&n,&m);
18     for(i=1;i<=n;i++)
19         scanf("%d",&a[i]);
20     sort(a+1,a+n+1);
21     a[++n]=L;
22     l=0,r=L;
23     while(l<r){
24         mid=(l+r+1)/2;
25         if(check(mid))l=mid;
26         else r=mid-1;
27     }
28     printf("%d\n",l);
29     return 0;
30 }

 

跳石头

原文:https://www.cnblogs.com/66dzb/p/11382267.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!