1316 丢瓶盖

难度:普及/提高-

题目类型:贪心/二分

提交次数:3

涉及知识:二分

题目描述

陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?

输入输出格式

输入格式:

第一行,两个整数,A,B。(B<=A<=100000)

第二行,A个整数,分别为这A个瓶盖坐标。

 

输出格式:

仅一个整数,为所求答案。

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int a, b;
 5 const int N = 100010; 
 6 int p[N];
 7 bool check(int x){
 8     int temp = p[0];
 9     int tot = 0;
10     for(int i = 1; i < a; i++){
11         if(p[i]- temp < x)
12             tot++;
13         else temp = p[i];
14     }
15     
16     if(a-tot>=b) return true;
17     return false;
18 }
19 int main(){
20     cin>>a>>b;
21     int i;
22     int minn = N;
23     int maxx = 0;
24     for(i = 0; i < a; i++){
25         cin>>p[i];
26         minn = min(minn, p[i]);
27         maxx = max(maxx, p[i]);
28     }
29     sort(p, p+a);    
30     int l = 1, r = maxx-minn;
31     int ans;
32     while(l <= r){
33         int mid = (l+r)/2;
34         if(check(mid)){
35             ans = mid;
36             l = mid+1;
37         } 
38         else r = mid-1;    
39     }
40     cout<<ans;
41 }

备注:

可能是因为刚做完数列分段2那道题。。这一道完全独立思考+独立写+独立查&改错。。听说是15年day2 第一题真题?

赤裸裸的二分,第一眼就觉得跟跳石头那道很像,写完才发现,完全是一模一样啊。唯一要考虑的点就是是a-tot>=b时return true。

为什么我提交了3遍呢?因为给的数据并不是排好序的啊orz。。不过我还是独立想到了这一点哈哈哈哈

posted @ 2016-10-06 20:27  timeaftertime  阅读(322)  评论(0编辑  收藏  举报