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。。不过我还是独立想到了这一点哈哈哈哈