• bzoj 3969 LOW Power


    3969: [WF2013]Low Power

    Time Limit: 20 Sec  Memory Limit: 256 MB

    题目连接

    http://www.lydsy.com/JudgeOnline/problem.php?id=3969

    Description

    有n个机器,每个机器有2个芯片,每个芯片可以放k个电池。
    每个芯片能量是k个电池的能量的最小值。
    两个芯片的能量之差越小,这个机器就工作的越好。
    现在有2nk个电池,已知它们的能量,我们要把它们放在n个机器上的芯片上,
    使得所有机器的能量之差的最大值最小。

    Input

    第一行,两个正整数,n和k。
    第二行,2nk个整数,表示每个电池的能量。

    Output

    一行一个整数,表示所有机器的能量之差的最大值最小是多少。

    Sample Input

    2 3
    1 2 3 4 5 6 7 8 9 10 11 12

    Sample Output

    1

    HINT

     2nk <= 10^6, 1 <= pi <= 10^9。

    【题目大意】

    让最大差值的机器的值最小。

    【思路】

    二分答案

    【code】

    我对二分右端点有点疑问。有的dalao r=排序后最后一个 我怎么觉得是 2*n*k-k+1个....

    bzoj崩了...没测...

    先考虑二分什么 ...二分的左右端点是什么...

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,k,mid,ans,l,r;
    int w[1000005];
    bool check()
    {
        /*for(int i=2*n;i;i--)
        {
            if(w[i]-w[i-1]>mid)
            return false;
        }*/
        for(int p=1,q=1;p<=2*n*k&&q<=n;p++)
        {
            if(2*q*k!=p)return false;
            if(w[p]-w[p-1]>mid)p++,q++; 
        }
        return true;
    }
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=2*n*k;i++)
        scanf("%d",&w[i]);
        sort(w+1,w+2*n*k+1);
    //    l=w[2]-w[1];
        r=w[2*n*k-k+1]-w[1];//*** 
        l=0;//最小两个数的差不一定最小。 
        while(l<=r)
        {
            mid=l+(r-l)/2;
            if(check())ans=mid,r=mid-1;
            else
            l=mid+1;
        }
        printf("%d
    ",ans);
        return 0;
     } 
  • 相关阅读:
    背水一战 Windows 10 (90)
    背水一战 Windows 10 (89)
    背水一战 Windows 10 (88)
    背水一战 Windows 10 (87)
    背水一战 Windows 10 (86)
    背水一战 Windows 10 (85)
    背水一战 Windows 10 (84)
    背水一战 Windows 10 (83)
    背水一战 Windows 10 (82)
    背水一战 Windows 10 (81)
  • 原文地址:https://www.cnblogs.com/zzyh/p/7041079.html
Copyright © 2020-2023  润新知