标签:des style blog http java color 使用 os
Description
Input
Output
Sample Input
5 3 1 2 8 4 9
Sample Output
3
Hint
FJ 有一个很长的 barn ,然后里面有 N 棚, N 个棚在一条直线上,第 i 个棚的位置为 xi.
然后他有 c 只羊,为了防止羊相互攻击,则要找出最大的两只羊之间距离,前提是这 c 只羊都必须能放下哈。
解题思路:先将 xi 由小到大排序, xn 最大。设这个最大距离为 s;0<s<=(xn-x1)/(c-1), 因为 c 只羊需要 c-1 个间隔。使用二分找 s 的可能取值,然后用贪心看是否成立。
Left=0;
right=(xn-x1)/(c-1);
mid=(left+right)/2; 如果间隔 mid 能够放下 c 只羊,则最大间隔在 [mid,right] ;
否则 [left,mid-1]. 继续寻找。
二分+贪心
#include <iostream> #include <stdio.h> #include<stdlib.h> using namespace std; #define MAXN 100003 int cmp(const void *x,const void *y){ return *(int *)x-*(int *)y; } int a[MAXN]; int N,C; bool greed(int x) { int cn=0; int p=a[0]; for (int i=1;i<N;i++) if (a[i]>=p+x) { cn++; p=a[i]; } if (cn>=C-1) return true ; return false ; } int main() { while (scanf("%d%d" ,&N,&C)!=EOF) { for (int i=0;i<N;i++) scanf("%d" ,&a[i]); qsort(a,N,sizeof (a[0]),cmp); int left,right,mid; left=0; right=(a[N-1]-a[0])/(C-1); while (left<=right) { mid=(left+right)/2; //printf("%d %d %d\n" ,left,right,mid); if (greed(mid)) left=mid+1; else right=mid-1; } printf("%d\n" ,left-1); } return 0; }
Aggressive cows,布布扣,bubuko.com
标签:des style blog http java color 使用 os
原文地址:http://www.cnblogs.com/lipching/p/3868326.html