NOIP 2015 提高组 复赛 day2 stone 跳石头
在研究二分法(二分查找),选中了该道题。
1.阅读题目,发现有很明显二分法(二分查找)痕迹,“这些岩石按与起点距离从小到大的顺序给出”。
2.第一步,先手动模拟样例输入输出数据。
3.第二步,编程实现,争取通过样例。
4.该题的核心是移石头,移的石头过多,要将跳跃长度变短,移的石头过少,要将跳跃长度变长。
5.稍微调了程序,样例通过,提交AC。该题是二分法的变形,与标准的二分搜索略有不同。详见代码。
附上AC代码,编译环境Dev-C++4.9.9.2.
#include <stdio.h>
int a[50000+10];
int L,n,m;
int check(int k){
int i;
int last;
int count;
last=0;
count=0;
for(i=1;i<=n;i++){
if(a[i]-last<k)
count++;
else
last=a[i];
}
return count;
}
int main(){
int left,right,mid;
int i;
scanf("%d%d%d",&L,&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
a[0]=0;
a[n+1]=L;
n++;
left=0;
right=L;
while(left<=right){
mid=(left+right)/2;
if(check(mid)>m)//移得太多
right=mid-1;
else// 移得太少
left=mid+1;
}
printf("%d\n",left-1);
return 0;
}