D 怎么那么多人过
我的想法是两个合并的时候若 i,j 可以组成最大,那么下一次只有可能是 (i+1,j),(i,j+1) 组成最大,那么这样两两合并做 (n−1) 次就可以了。
然而 WA on 5
#include <iostream>
#include <set>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
#define int long long
int n, k, m;
std::vector<int> a[15];
struct dwd {
int a, x, y;
dwd(int _a, int _x, int _y) { a = _a, x = _x, y = _y; }
bool operator < (dwd b) const { return a > b.a; }
};
struct twt {
std::vector<int> b;
int val;
void push(int x) {
int now = b.size();
b.push_back(x), val += a[now+1][x];
}
twt(int x) { val = 0; b.clear(); push(x); }
twt() { b.clear(); val = 0; }
bool operator < (const twt &b) const { return val > b.val; }
bool operator != (const twt &z) {
for (int i = 0; i < n; i++) if (b[i] != z.b[i]) return true;
return false;
}
void print() {
for (int i = 0; i < (int)b.size(); i++)
std::cout << a[i+1][0]-b[i]+1 << ' ';
}
};
std::vector<twt> s, tmp, fo;
std::set<dwd> t;
void merge(int q) {
t.clear(), tmp.clear();
t.insert(dwd(s[0].val + a[q][1], 0, 1));
// std::cout << q << ':' << s[0].val << '\n';
// int cnt = 0;
// std::cout << m << "&\n";
while (tmp.size() <= m+1 && !t.empty()) {
int i = t.begin()->x, j = t.begin()->y;
t.erase(t.begin());
twt cur = s[i];
cur.push(j);
tmp.push_back(cur);
if (i+1 < (int)s.size()) t.insert(dwd(s[i+1].val + a[q][j], i+1, j));
if (j+1 <= a[q][0]) t.insert(dwd(s[i].val + a[q][j+1], i, j+1));
// cnt ++;
}
// std::cout << tmp.size() << '\n';
s = tmp;
}
signed main() {
std::cin >> n;
for (int i = 1; i <= n; i++) {
std::cin >> k;
a[i].resize(k+1), a[i][0] = k;
for (int j = 1; j <= k; j++) std::cin >> a[i][j];
std::sort(std::next(a[i].begin()), a[i].end(), std::greater<int>());
}
std::cin >> m;
for (int i = 1; i <= a[1][0]; i++) s.push_back(twt(i));
std::sort(s.begin(), s.end());
// std::cout << s.size();
for (int i = 2; i <= n; i++) {
// std::cout << s.size() <<m '\n';
merge(i);
// for (int i = 0; i < (int)s.size(); i++) {
// s[i].print();
// std::cout << "*\n";
// }
}
for (int i = 1; i <= m; i++) {
twt cur;
for (int j = 1; j <= n; j++) std::cin >> k, cur.push(a[j][0]-k+1);
fo.push_back(cur);
}
std::sort(fo.begin(), fo.end());
// fo[0].print();
int j = 0;
// std::cout << s.size() << '\n';
for (auto cur : s) {
if (j >= (int)fo.size() || cur != fo[j]) return cur.print(), 0;
j ++;
}
}
为啥 WA 了?
这么做是不是复杂了啊,那么多人过。
真的被 edu 给教育了