| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
详细二分题解吧,附代码我WA了三次没找到错误,结果居然是INF不够大
二分思路很明确,就是二分来贪婪的找最大值,C(x)来判断该值是否可行
详细注释在代码里了,希望可以帮到后面的同学
/*AC*/
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#define INF 99999999999
#define MAX_N 51000
using namespace std;
typedef long long ll;
ll L,dis[MAX_N];
int M,N;
bool C(int x){
int st=0,ed=st+1,sum=0;
for(;ed<=N+1;ed++){//遍历所有区间
if((dis[ed]-dis[st])>=x){//如果这个区间长度符合要求
st=ed;//开始检测后面的区间
sum++;//记下这个区间
}
}
if(sum>=(2+N-M-1)) return true;//若区间数>=去掉M块石头后的区间数则x可行
else return false;
}
int main()
{
while(cin>>L>>N>>M)
{
int lb=0,ub=INF;
dis[0]=0;
for(int i=1;i<N+1;i++){
cin>>dis[i];
}
dis[N+1]=L;
if(N==0&&M==0) cout<<L<<endl;
else{
sort(dis,dis+N+1);
for(int i=0;i<100;i++){//二分法返回最大长度
int mid=(lb+ub)/2;
if(C(mid)) lb=mid;
else ub=mid;
}
cout<<lb<<endl;
}
}
return 0;
}
如可读性不佳可移步UbuntuPastbin:https://paste.ubuntu.com/p/gKknxZcYxc/
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator