您的位置:首页 > 其它

bzoj 3969: [WF2013]Low Power

2015-05-21 10:42 423 查看

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<string>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1000001];
bool v[1000001];
int n,k,m;
inline bool check(int lim)
{
memset(v,false,sizeof(v));
int i;
int s=0;
for(i=1;i<=m-1;i++)
{
if(a[i+1]-a[i]<=lim)
{
s++;
v[i]=true;
v[i+1]=true;
i++;
if(s>=n)
break;
}
}
if(s<n)
return false;
int sum=0;
for(i=m;i>=1;i--)
{
if(!v[i])
sum++;
else
{
if(sum<k-1)
return false;
sum-=(k-1);
}
}
return true;
}
int main()
{
scanf("%d%d",&n,&k);
m=2*n*k;
int i;
for(i=1;i<=m;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+m);
int l=0,r=1000000000;
while(l<=r)
{
int mid=(l+r)/2;
if(!check(mid))
l=mid+1;
else
r=mid-1;
}
printf("%d\n",l);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: