您的位置:首页 > 其它

【二分贪心】Bzoj3969 [WF2013] Low Power

2015-05-25 01:05 253 查看

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。

根据经验肯定先要排序

最大值最小熟悉的设问那么考虑要二分

肯定要尽量往前选

于是检验

//检验部分借鉴了别人的代码真是精简

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;

int n,k,a[maxn];

int check(int x){
for(int p=1,q=0;q<n&&p<=2*n*k;p++){
if(p-1>q*2*k) return 0;
if(a[p+1]-a[p]<=x) q++,p++;
}
return 1;
}

int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=2*n*k;i++)
scanf("%d",&a[i]);
sort(a+1,a+2*n*k+1);

int l=0,r=a[2*n*k]-a[1];
while(l<r){
int mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}

printf("%d",l);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: