阅读理解题,就是猜杯中几个几点,首先可以肯定的是这两个人有对的一定会猜对的,不然下个选手Challenge一下就死掉了,然后有三个特殊规则
一.没人猜一点个数相当于多了一次机会,情况有两种,就是有一点和没有一点
1.没有一点时,如果其他有的点数的个数大于1,先手必胜,否则,后手必胜
2.有一点时,如果只有一点和另外一个个数大于1的点数,后手必胜,否则先手必胜
二.一个杯子中所有点数都相等,相当于这杯子中有n+1个这个点数
三.如果一个杯子中点数各不相同,相当于没有点数,要优先判断,如果两个杯子都是各不相同点数,后手必胜
AC代码:
#include <iostream> #include <cstdio> #include <queue> #include <deque> #include <stack> #include <string> #include <cstring> #include <numeric> #include <functional> #include <cstdlib> #include <vector> #include <set> #include <map> #include <algorithm> #include <cmath> #include <iomanip> #define rep(i,a,n) for(int i=a;i<n;i++) using namespace std; using LL = long long; //head void Solve() {//一个杯中全部相同->认为n+1个分,没说x个1分->猜x个均对,一个杯中各不相同->该杯不看 int n;//一定从1开始数 cin >> n; vector<int> a(n); vector<int> b(n); vector<int> mp(7); set<int> sea, seb; int cnt = 0; int ans = 0; for (int i = 0; i < n; i++) { cin >> a[i]; sea.insert(a[i]); mp[a[i]]++; if (a[i] == 1) { cnt++; } } for (int i = 0; i < n; i++) { cin >> b[i]; mp[b[i]]++; seb.insert(b[i]); if (a[i] == 1) { cnt++; } } if (sea.size() == n && seb.size() == n) { cout << "Just a game of chance.\n"; return; } if (cnt == 0) {//机会++ ans++; } if (sea.size() == 1) { mp[a[0]]++; } if (seb.size() == 1) { mp[b[0]]++; } if (sea.size() == n) { for (int i = 0; i < n; i++) { mp[a[i]]--; } } if (seb.size() == n) { for (int i = 0; i < n; i++) { mp[b[i]]--; } } int now = 0; for (int i = 1; i <= 6; i++) { now += mp[i] > 0 ? 1 : 0; } if (ans == 0) {//has 1 if (n == 1) { cout << "Win!\n"; } else if (n == 2) { cout << "Just a game of chance.\n"; } else { cout << "Win!\n"; } } else { int now = 0; for (int i = 1; i <= 6; i++) { now += mp[i] > 0 ? 1 : 0; } if (now == 1) { cout << "Just a game of chance.\n"; } else { cout << "Win!\n"; } } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; rep (i, 0, T) { Solve(); } return 0; }
2022“杭电杯”中国大学生算法设计超级联赛(5)J
于 2022-08-02 16:48:15 首次发布