div3笔记
这道题用了记录一个数末尾零的板子(敲重点)!!!
再说一遍,简单博弈论就是贪心!

1 void solve() { 2 cin >> n >> m; 3 vector<int> a(n), b(n); 4 for (int i = 0; i < n; i++) cin >> a[i]; 5 int len = 0; //这组数字总共有几位,总长度 6 for (int i = 0; i < n; i++) { 7 int zhi = a[i], res = 0, shu = 0; 8 bool ok = false; 9 while (zhi) { 10 if (zhi % 10 == 0) { 11 if (ok == false) res++; //当前有几个末尾0 12 } else 13 ok = true; 14 zhi /= 10; 15 shu++; //当前数字有几位 16 } 17 len += shu; 18 b.pb(res); 19 } 20 sort(all(b)); 21 int k = b.size(); 22 int cnt = 0, shan = 0; 23 for (int i = k - 1; i >= 0; i--) { 24 if (cnt == 0) { 25 shan += b[i]; 26 cnt = 1; 27 } else 28 cnt = 0; 29 } 30 if (len - shan <= m) { 31 cout << "Anna" << endl; 32 } else 33 cout << "Sasha" << endl; 34 }
拓扑排序板子

1 void solve() { 2 cin >> n >> k; 3 vector<set<int>> que(n + 1); //记录被哪些点到达 4 vector<set<int>> cue(n + 1); //记录到达哪些点 5 for (int i = 0; i < k; i++) { 6 int x; 7 cin >> x; 8 if (n != 1) cin >> x; //第一个点是没用的,如果N为1的话,需要输入特判 9 int shang = x; //记录上一个点 10 for (int j = 2; j <= n - 1; j++) { 11 cin >> x; 12 que[shang].insert(x); 13 cue[x].insert(shang); 14 shang = x; 15 } 16 } 17 if (k == 1) { 18 cy; 19 return; 20 } 21 int shu[n + 1]; //每个位置被几个点到 22 queue<int> q; 23 for (int i = 1; i <= n; i++) { 24 shu[i] = que[i].size(); //记录一下被多少个点到达 25 if (shu[i] == 0) //如果这个点没被到达,没大小关系 26 q.push(i); 27 } 28 int cnt = 0; 29 map<int, int> da; //因为存在环,所以不能跑回来,我们要记录一下 30 while (!q.empty()) { //跑拓扑序 31 int z = q.front(); 32 q.pop(); 33 cnt++; //记录删了多少个点 34 da[z] = 1; 35 for (auto x : cue[z]) { //最后去跑到下一个点 36 if (da[x] == 1) { 37 continue; 38 } 39 shu[x]--; 40 if (shu[x] == 0) { 41 q.push(x); 42 } 43 } 44 } 45 if (cnt == n) 46 cy; 47 else 48 cn; 49 }