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 |
先对给定的位置从小到大排序,然后用折半(二分)来 确定largest minimal distance!! 超时啊!!In Reply To:这个题目怎么省时间啊!!我用快速排序通不过!!(附有程序) 大牛们帮忙优化一下或几下!(-_-)! Posted by:ook at 2005-07-26 19:16:03 > #include "stdio.h" > #include "memory.h" > long n,c; > long a[100001]; > > > long partition(long low,long high) > { > long temp; > temp=a[low]; > while(low<high){ > while(low<high&&a[high]>=temp) --high; > a[low]=a[high]; > while(low<high&&a[low]<=temp) ++low; > a[high]=a[low]; > } > a[low]=temp; > return low; > } > > long quick(long low,long high) > { > long pivotloc; > if(low<high) { > pivotloc=partition(low,high); > quick(low,pivotloc-1); > quick(pivotloc+1,high); > } > return 1; > } > > void bisection(long min,long max) > { > long medi,i,num,temp1,flag; > long high,low; > low=1; > high=max-min+1; > while(high-low>1) > { > num=c; > medi=(low+high)/2; > temp1=a[1]; > flag=0; > num--; > for(i=2;i<=n;i++) > { > if(a[i]-temp1>=medi) > { > num--; > temp1=a[i]; > if(num==0) > { > flag=1; > break; > } > } > } > if(flag==1) low=medi; > else > high=medi; > } > printf("%ld\n",low); > } > > long main() > { > long i,max=0,min=1000000001; > scanf("%ld%ld",&n,&c); > memset(a,0,sizeof(a)); > for(i=1;i<=n;i++) > { > scanf("%ld",&a[i]); > if(a[i]<min) min=a[i]; > if(a[i]>max) max=a[i]; > } > quick(1,n); > bisection(min,max); > return 1; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator