POJ2456(二分最大化最小值)

    xiaoxiao2022-07-07  205

    声乐考核没叔,?nsl,我已经等了半个小时侥幸者了说散就散来了快看!! mmp您怎么唱成这个样子?我吹不动了,给钱 希望十点之前我可以改掉上面这句话

    Description

    Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,…,xN (0 <= xi <= 1,000,000,000).

    His C (2 <= C <= N) cows don’t like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?

    Input

    Line 1: Two space-separated integers: N and C

    Lines 2…N+1: Line i+1 contains an integer stall location, xi

    Output

    Line 1: One integer: the largest minimum distance

    Sample Input

    5 3 1 2 8 4 9

    Sample Output

    3

    Solution

    二分枚举区间,然后贪心就完事了 需要注意的地方: ·开long long ·从第二个开始贪心 ·注意把mid定义在外面 没了

    AC代码

    #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #define ll long long using namespace std; int n,c; //int arr; ll a[100005]; bool judge(ll s) { ll step=1; ll start=a[1]; //int end=start+s; for(ll i=2;i<=n;++i) { if(a[i]-start>=+s) { start=a[i]; ++step; //printf("//%d %d\n",start,end); } } return step>=c; } int main() { while(~scanf("%d %d",&n,&c)) { for(int i=1;i<=n;++i) { scanf("%lld",&a[i]); } sort(a+1,a+1+n); //arr=a[n]; //int ans; ll up=a[n]; ll down=0; ll mid; while((up-down)>1) { mid=(up+down)/2; //printf("%d\n%d %d\n",mid,up,down); if(judge(mid)==1) { down=mid; } else up=mid; //ans=mid; } printf("%lld\n",up-1); } return 0; }
    最新回复(0)