您的位置:首页 > 其它

poj 2456 Aggressive cows poj 3258 (二分)

2014-07-28 19:33 411 查看
poj 2456
// n点中选c点放下c头牛 是的n-1段距离中的最短距离最大 ,求这个最大的最短距离//假设当前的最小值为x,如果判断出最小差值为x时可以放下C头牛,//就先让x变大再判断;如果放不下,说明当前的x太大了,//就先让x变小然后再进行判断。直到求出一个最大的x就是最终的答案。# include <algorithm># include <string.h># include <stdio.h>using namespace std;int n,c,i,a[100010];int judge(int x){int cot=1;int tmp=a[0];for(i=1;i<n;i++){if(a[i]-tmp>=x)//距离大于栏的间隙 可以放下{cot++;tmp=a[i];if(cot>=c)//可以排下c头牛return true;}}return false;}int slove()//二分查找{int l=0;//最小距离int r=a[n-1]-a[0];//最大距离while(l<=r){int mid=(l+r)/2;if(judge(mid))//可以排下c头牛l=mid+1;elser=mid-1;}return l-1;}int main(){while(~scanf("%d%d",&n,&c)){for(i=0;i<n;i++)scanf("%d",&a[i]);sort(a,a+n);printf("%d\n",slove());}return 0;}
poj 3258
include <algorithm># include <stdio.h># include <string.h>using namespace std;int n,m;int a[50010];int slove(int x){int cot=0;int tmp=a[0];for(int i=1;i<=n;i++){if(a[i]-tmp>=x){cot++;tmp=a[i];if(cot>=(n-m))return true;}}return false;}int main(){int L,i;while(~scanf("%d%d%d",&L,&n,&m)){memset(a,0,sizeof(a));for(i=1;i<=n;i++)scanf("%d",&a[i]);sort(a,a+n+1);if(n==m){printf("%d\n",L);continue;}int l=0;int r=L;while(l<=r){int mid=(l+r)/2;if(slove(mid))l=mid+1;elser=mid-1;}printf("%d\n",l-1);}return 0;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: