noip2015提高组day2t1
题目里看到了最大值最小,可以判断用二分答案;
类似关键词还有最小值最大;
前边的最大最小是一种条件,在符合条件的情况下最大或最小;
在该题中则为拿走石头数与题里的m作比较,再一步步缩小mid范围
注意的是终点也有石头,还有坑点是函数里第一块石头也需要和起点作比较
#include<iostream> #include<cstdio> using namespace std; int l,m,n,mid,x; int d[50005]; int fuck(int a){ int ans=0; int rr=0; for(int i=1;i<=n;i++){ if(d[i]-d[rr]<=mid){ ans++; }else{ rr=i; } }return ans; } int main(){ scanf("%d%d%d",&l,&n,&m); d[0]=0; for(int i=1;i<=n;i++){ scanf("%d",&d[i]); } n++; d[n]=l; int left,right; right=l; left=0; while(left<=right){ mid=(left+right)/2; x=fuck(mid); if(x>m){ right=mid-1; }else{ left=mid+1; } }printf("%d",left); return 0; }