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
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;
}