2016夏季练习——二分
2016-07-15 12:20
246 查看
来源:POJ2456
二分水题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100000+10;
int n,m;
int a[MAXN];
bool judge(int d){
int cnt=1;
int len=a[0]+d;
for(int i=0;i<n;i++){
if(a[i]>=len){
len=a[i]+d;
cnt++;
}
}
if(cnt>=m) return 1;
return 0;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",a+i);
}
sort(a,a+n);
int left=0;
int right=a[n-1]-a[0];
int mid;
int ans;
while(left<=right) {
mid=(left+right)/2;
if(judge(mid)){
left=mid+1;
ans=mid;
}
else{
right=mid-1;
}
// cout<<left<<" "<<mid<<" "<<right<<endl;
}
cout<<ans<<endl;
}
return 0;
}
二分水题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100000+10;
int n,m;
int a[MAXN];
bool judge(int d){
int cnt=1;
int len=a[0]+d;
for(int i=0;i<n;i++){
if(a[i]>=len){
len=a[i]+d;
cnt++;
}
}
if(cnt>=m) return 1;
return 0;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",a+i);
}
sort(a,a+n);
int left=0;
int right=a[n-1]-a[0];
int mid;
int ans;
while(left<=right) {
mid=(left+right)/2;
if(judge(mid)){
left=mid+1;
ans=mid;
}
else{
right=mid-1;
}
// cout<<left<<" "<<mid<<" "<<right<<endl;
}
cout<<ans<<endl;
}
return 0;
}
相关文章推荐
- 购物车与商城订单的关系以及技术实现深入分析
- CentOS7.2上搭建httpd-2.4
- POJ 3678 Katu Puzzle
- 五种常见的 PHP 设计模式
- 面试题汇总
- 向上/向下取整和四舍五入编程实现
- 私有网络地址
- apply函数处理数据的方式
- Java Web学习(15): 客户端请求、服务器响应及其HTTP状态码
- Codeforces Round #362 (Div. 2) A.B.C
- 分页查询优化
- Android面试一天一题(2)优雅地介绍自己的项目
- ServletContextListener 接口
- 【旧代码整理】uri路由处理部分
- 打印蛇形矩阵
- mysql 日期操作 增减天数、时间转换、时间戳
- POP3反复弹框问题
- MediBang Paint Pro超级精简版/超精简/懂你版
- hrbust 1186 青蛙过河【Dp】
- React组件的生命周期