zoukankan      html  css  js  c++  java
  • 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;
     } 
  • 相关阅读:
    mysql前缀索引的应用
    记博客园
    好的博客网站(随手记)
    memcache应对缓存失效问题
    memcache内存分配问题
    memcached使用libevent 和 多线程模式
    RabbitMQ用户及权限控制
    Nginx基础之常用配置
    PHP-fpm进程池优化方法
    php-fpm参数详解
  • 原文地址:https://www.cnblogs.com/zzyh/p/7041079.html
Copyright © 2011-2022 走看看