标签:
二分.
同 POJ 2456 , 但有一点不同:start与end位置是已经确定好的,只需要在中间n个石子中确定n-m个即可.第一个石子与a[0]即start位置比较,结束之后还要再比较a[n+1]-a[last]>=x是否成立.(也是错误点1)
注意:
1.如上所述.
2.输入数据是无序的,需先用快排进行排序.
1 #include<cstdio> 2 #include<algorithm> 3 using std :: sort; 4 5 const int maxn=50005; 6 int n,l,m; 7 int a[maxn]; 8 9 void init() 10 { 11 scanf("%d%d%d",&l,&n,&m); 12 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 13 sort(a+1,a+n+1); 14 a[n+1]=l; 15 } 16 17 bool C(int x) 18 { 19 int last=0; 20 for(int i=1;i<=n-m;i++) 21 { 22 int now=last+1; 23 while(now<=n&&(a[now]-a[last])<x) now++; 24 if(now>n) return false; 25 last=now; 26 } 27 if(a[n+1]-a[last]<x) return false; 28 return true; 29 } 30 31 int bsearch(int x,int y) 32 { 33 while(x<y) 34 { 35 int m=x+(y-x+1)/2; 36 if(C(m)) x=m; 37 else y=m-1; 38 } 39 return x; 40 } 41 42 void solve() 43 { 44 int INF=l/(n+1-m); 45 int ans=bsearch(1,INF); 46 printf("%d\n",ans); 47 } 48 49 int main() 50 { 51 freopen("river.in","r",stdin); 52 freopen("river.out","w",stdout); 53 init(); 54 solve(); 55 fclose(stdin); 56 fclose(stdout); 57 return 0; 58 }
POJ_3258_River_Hopscotch(NOIP_2015_D2T1)
标签:
原文地址:http://www.cnblogs.com/Sunnie69/p/5423190.html