HDU 4620

来源:互联网 发布:印度超级联赛直播数据 编辑:程序博客网 时间:2024/06/08 17:07
#include <bitset>#include <cstring>#include <cstdio>#include <algorithm>#include <set>#include <vector>#include <iterator>using namespace std;typedef vector<int> VI;const int maxn = 211;int cnt[maxn];int N, M, W;struct node {int fruit[10];int size, time, id;node(int size = 0, int time = 0, int id = -1) :size(size), time(time), id(id) {for (int i = 0; i < size; ++i)scanf("%d", &fruit[i]);}bool operator<(const node& t) const {return time < t.time;}} f[maxn];int st[maxn], size;int ans[maxn], sz;int cut(int k) {int t = 0;for (int i = 0; i < f[k].size; ++i)t += cnt[f[k].fruit[i]] == 0;return t;}void update(int k, int c) {for (int i = 0; i < f[k].size; ++i)cnt[f[k].fruit[i]] += c;}void dfs(int k, int dep, int sum) {if (dep > sz) {sz = dep;copy(st, st + dep, ans);}if (dep + N - k <= sz)return;if (M - sum < 3)return;int t;for (int i = k; i < N; ++i) {if (dep && f[k - 1].time + W < f[i].time)return;t = cut(i);if (t < 3)continue;update(i, 1);st[dep] = f[i].id;dfs(i + 1, dep + 1, sum + t);update(i, -1);}}int main() {int i, time;int T;scanf("%d", &T);while (T--) {scanf("%d%d%d", &N, &M, &W);for (i = 0; i < N; ++i) {scanf("%d%d", &sz, &time);f[i] = node(sz, time, i);}sort(f, f + N);sz = size = 0;dfs(0, 0, 0);sort(ans, ans + sz);printf("%d\n", sz);for (i = 0; i < sz; ++i) {if (i)putchar(' ');printf("%d", ans[i] + 1);}puts("");}return 0;}

原创粉丝点击