[NOIp2015提高组]跳石头
OJ题号:洛谷2678
思路:贪心+二分。
从前往后扫,一旦这个石头到上一个选的石头的距离小于二分的值就把这块石头移走。
1 #include<cstdio> 2 #include<queue> 3 bool check(int mid,int m,int n,int *a) { 4 int p=0,w=0; 5 for(int i=1;i<=n;i++) { 6 if(a[i]-p<mid) { 7 w++; 8 } 9 else { 10 p=a[i]; 11 } 12 } 13 return w<=m; 14 } 15 int main() { 16 int l,n,m; 17 scanf("%d%d%d",&l,&n,&m); 18 int a[n+2]; 19 a[0]=0; 20 a[n+1]=l; 21 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 22 n++; 23 int b,e; 24 for(b=1,e=l;b<=e;) { 25 int mid=(b+e)>>1; 26 if(check(mid,m,n,a)) { 27 b=mid+1; 28 } 29 else { 30 e=mid-1; 31 } 32 } 33 printf("%d\n",e); 34 return 0; 35 }