您的位置:首页 > 其它

BZOJ 3969 Low Power 解题报告

2015-04-14 09:20 183 查看
我们首先将所有电池排序,那么我们可以找到一组最优方案,使得一台机器的能量之差是相邻两电池的能量之差。

然后我们就二分这个答案,从前往后贪心地选这个数对,然后看是否所有的数对都是满足条件的。

假设这个数对是 i - 1, i,并且是第 j 个数对,那么我们称满足条件为:

2nk - i + 2 >= 2k(n - j + 1)

意思就是能拿出足够多的电池来组成机器人。

然后注意特判:如果不能选出足够多的数对就返回 false,我在这里 WA 到死。。。

毕竟 Gromah 太弱,只会做水题。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1000000 + 5

int n, k, size, Max, A
;

inline int getint()
{
char ch = '\n';
for (; ch > '9' || ch < '0'; ch = getchar()) ;
int res = ch - '0';
for (ch = getchar(); ch >= '0' && ch <= '9'; ch = getchar())
res = (res << 3) + (res << 1) + ch - '0';
return res;
}

inline bool Judge(int m)
{
int cnt = n;
for (int i = 2; cnt && i <= size; i ++)
if (A[i] - A[i - 1] <= m)
{
if (size - i + 2 < 2 * cnt * k) return 0;
cnt --, i ++;
}
return !cnt;
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("3969.in", "r", stdin);
freopen("3969.out", "w", stdout);
#endif

n = getint(), k = getint();
size = (n * k) << 1;
for (int i = 1; i <= size; i ++)
{
A[i] = getint();
Max = max(Max, A[i]);
}
sort(A + 1, A + size + 1);
int l = A[2] - A[1], r = Max;
while (l < r)
{
int mid = (l + r) >> 1;
if (Judge(mid)) r = mid;
else l = mid + 1;
}
printf("%d\n", l);

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