原题:https://vjudge.net/problem/UVA-804 分类:杂题 备注:模拟,水题
代码如下:
#include<cstdio> #include<vector> #include<algorithm> #include<map> using namespace std; const int maxn = 100 + 5; int np, nf, nt, id[maxn], kase; struct node { int id, in, out; }; map<int, int>hav; map<int, map<int, int> >p; bool canDo(int x) { for (auto it = p[x].begin(); it != p[x].end(); ++it) { int pos = it->first; int update = it->second; if (hav[pos] + update < 0)return false; } return true; } bool cmp(int a, int b) { if (hav[a] != hav[b])return hav[a] < hav[b]; else return a < b; } int main(void) { while (~scanf("%d", &np) && np) { hav.clear(); for (int i = 1; i <= np; i++) { int x; scanf("%d", &x); hav[i] = x; } scanf("%d", &nf); for (int i = 0; i < nf; i++) { p[i].clear(); int x; while (1) { scanf("%d", &x); if (x > 0)p[i][x]++; else if (x < 0)p[i][-x]--; else break; } } scanf("%d", &nt); int flag = 1, cnt = 0; while (flag && cnt < nt) { flag = 0; for (int i = 0; i < nf; i++) { if (!canDo(i))continue; flag = 1; cnt++; for (auto it = p[i].begin(); it != p[i].end(); ++it) { int pos = it->first; int update = it->second; hav[pos] += update; } break; } } vector<int>ans; for (auto it = hav.begin(); it != hav.end(); ++it) if (it->second > 0)ans.push_back(it->first); sort(ans.begin(), ans.end(), cmp); printf("Case %d: %s after %d transitions\n", ++kase, cnt == nt ? "still live" : "dead", cnt); printf("Places with tokens:"); for (int i = 0; i < ans.size(); i++) printf(" %d (%d)", ans[i], hav[ans[i]]); printf("\n\n"); } return 0; }