数差
描述
在今天的数学课上,同学们昏昏欲睡,老师非常生气,于是在黑板上写了N个整数ai.然后提出一个问题,让同学们从中选C个数,使得这c个数任意两个数差的绝对值最小尽可能大,请你求出这个值来。
输入
第一行是N和C。 接下来的1行N整数ai。
输出
一个整数,表示两两最小差距的最大值。
提示
【提示】
选择1、4和8
【数据规模】
2<=N<=100000 0<=ai<=1000 000 000
这题求最大值,没有动态规划的性质,又不可以直接贪心,那么我们就考虑二分就可以了
二分我的统一模板如下
1 while(l<=r){ 2 int mid=l+r>>1; 3 if(check(mid))ans=mid,l=mid+1; 4 else r=mid-1; 5 }
事先排好序,由于每次check要找尽量凑齐c个数,所以用stl的lower_bound函数二分查找当前数的位置,找到了继续+mid再二分找最小位置,可以证明这是最优
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int n,c,a[10000005]; 6 int check(int x){ 7 int num=1,temp=a[1]; 8 while(num<c){ 9 temp+=x; 10 int pos=lower_bound(a+1,a+n+1,temp)-a; 11 if(a[pos]<temp)pos++; 12 if(pos>n)return 0; 13 temp=a[pos]; 14 num++; 15 } 16 return 1; 17 } 18 int main(){ 19 cin>>n>>c; 20 for(int i=1;i<=n;i++)cin>>a[i]; 21 sort(a+1,a+n+1); 22 int l=1,r=1000000000;int ans; 23 while(l<=r){ 24 int mid=l+r>>1; 25 if(check(mid))ans=mid,l=mid+1; 26 else r=mid-1; 27 } 28 cout<<ans; 29 return 0; 30 }