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

转载于:https://www.cnblogs.com/fangziyuan/p/5934724.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值