贪心。从小到大每个灯泡找个小于等于它的最接近的房间去照。
剩下的照不亮的房间直接换。
剩下的背包空间把已经匹配的差最大的换掉。
第一步要拿堆维护一下。剩下的直接排序。
然后把nie写成-1了,no save。
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long di;
#ifdef WIN32
#define difmt "%I64d"
#else
#define difmt "%lld"
#endif
const int maxn = 500009;
int _d_;
#define readInt(_x_) { \
int& _s_ = _x_; \
while (!isdigit(_d_ = getchar())); \
_s_ = 0; \
while ((_s_ = _s_ * 10 + _d_ - 48), isdigit(_d_ = getchar())); \
}
int n, k, p[maxn], w[maxn], x[maxn], t;
di ans;
int main() {
readInt(n);
readInt(k);
for (int i = 0; i < n; ++ i)
readInt(p[i]);
for (int i = 0; i < n; ++ i)
readInt(w[i]);
sort(p, p + n);
sort(w, w + n);
t = 0;
ans = 0;
for (int i = 0; i < n; ++ i)
ans += w[i];
for (int i = 0, j = 0, th = 0; i < n && k >= 0; ++ i) {
for (; j < n && w[j] <= p[i]; w[th] = w[j ++], push_heap(w, w + (++ th)));
if (th) {
x[t ++] = p[i] - w[0];
pop_heap(w, w + (th --));
}
else
-- k;
}
if (k < 0)
puts("NIE");
else {
sort(x, x + t);
for (int i = t - k - 1; i >= 0; -- i)
ans += x[i];
printf(difmt "\n", ans);
}
}