| ||||||||||
| 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 | |||||||||
关于二分的一个疑问,望牛人解答,内附代码#include<iostream>
using namespace std;
#define N 50005
#define M 2000000000
int rock[N];
void quick(int i,int j)
{
if(i>=j)
return;
int a=rock[i];
int x=i,y=j;
while(x<y)
{
while(x<y&&rock[y]>=a)y--;
rock[x]=rock[y];
while(x<y&&rock[x]<=a)x++;
rock[y]=rock[x];
}
rock[x]=a;
quick(i,x-1);
quick(x+1,j);
}
int main()
{
int l,n,m;
int sum,min,mid,s,cnt,d;
while((scanf("%d %d %d",&l,&n,&m))!=EOF)
{
sum=0;
min=M;
for(int i=0;i<n;i++)
{
scanf("%d",rock+i);
}
rock[n]=l;
quick(0,n);
sum=l;
for(int i=1;i<=n;i++)
{
d=rock[i]-rock[i-1];
if(min>d)
min=d;
}
s=0;
mid=(sum-min+1)/2+min;
while(min<sum)
{
cnt=0;
s=0;
for(int i=0;i<=n;i++)
{
d=rock[i]-s;
if(d>=mid)
{
cnt++;
s=rock[i];
}
}
if(cnt>=n-m+1)
min=mid;
else
sum=mid-1;
mid=(sum-min+1)/2+min;
}
cout<<sum<<endl;/*这是AC的代码,可是为什么把这一句改成cout<<min<<endl;就变成了WA,
min和sum不应该是一样的吗*/
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator