题目大意
有n个机器,每个机器有两块芯片,每块芯片上有k块电池,定义芯片的能量为其上k块电池的最小值,求每个机器上两块芯片的能量差的最大值的最小值
解答
很容易发现,两块芯片上电池的最小值是两个大小关系相邻的值为最优策略,然后二分答案求最小值即可。
代码:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m, k;
int e[1000500];
void readin()
{
scanf("%d %d", &n, &k);
m = 2*n*k;
for (int i = 0; i < m; i++)
scanf("%d", &e[i]);
sort(e, e+m);
}
bool check(int delta)
{
int cnt = 0;
for (int i = m-1; i > 0; i--)
if (e[i] - e[i-1] <= delta)
if (m-i+1 >= 2*(cnt+1)*k) {
cnt++;
i--;
if (cnt == n)
return true;
}
return false;
}
void work()
{
int l = 0, r = 1000000001;
int mid;
while (l <= r) {
mid = (l+r) >> 1;
if (check(mid))
r = mid-1;
else
l = mid + 1;
}
printf("%d", r+1);
}
int main()
{
readin();
work();
return 0;
}