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;
 } 
原文地址:https://www.cnblogs.com/zzyh/p/7041079.html