数差

描述

在今天的数学课上,同学们昏昏欲睡,老师非常生气,于是在黑板上写了N个整数ai.然后提出一个问题,让同学们从中选C个数,使得这c个数任意两个数差的绝对值最小尽可能大,请你求出这个值来。

输入

第一行是N和C。 接下来的1行N整数ai。

输出

一个整数,表示两两最小差距的最大值。

样例输入[复制]
5 3 
1 2 8 4 9
样例输出[复制]
3
提示

【提示】

选择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 }

 

posted @ 2018-08-26 01:22  saionjisekai  阅读(490)  评论(0编辑  收藏  举报