nyoj 586 疯牛

来源:互联网 发布:音乐识别的软件 编辑:程序博客网 时间:2024/06/05 04:09

原题: http://acm.nyist.net/JudgeOnline/problem.php?pid=586

 //nyoj 586//即从n个栅栏中选k个,使得这k个栅栏之间的距离要尽可能地大//贪心:要使得任意两个栅栏之间的距离最大,只需要使依次的两个栅栏之间的距离最大,即栅栏1和栅栏2最大,栅栏2根栅栏3最大....就可以保证每两个距离最大 //      而数目已知为k,结果的范围也已知,用二分+贪心查找 #include<iostream>#include<cstdio>#include<algorithm>#include<math.h>using namespace std;int cmp(const void *aa,const void *bb)//由小到大 {int a=*(int *)aa;int b=*(int *)bb;return a>b;}int n,k;int z[100001];int greed(int span)//贪心,假设span是最大距离情况中最小的距离 {int cnt=1;int now=z[0]+span;for(int i=1;i<n;i++){if(z[i]>=now){now=z[i]+span;cnt++;}}if(cnt>=k)return 1;return 0;} int main(){while(~scanf("%d %d",&n,&k)){for(int i=0;i<n;i++){scanf("%d",&z[i]);}qsort(z,n,sizeof(z[0]),cmp);int r=z[n-1]-z[0];//结果范围在l~r int l=0;int rs;while(l<=r)//二分 {int mid=(l+r)/2;if(greed(mid)){rs=mid;l=mid+1;}else{r=mid-1;}}printf("%d\n",rs);} return 0;}                 


原创粉丝点击