河南理工XCPC萌新选拔赛
A 树之荣荣 青梅熙熙
树之荣荣 青梅熙熙
这个题是一个经典的博弈问题。我们可以考虑一种情况,就是你每一次都会取一个。那么最后一个你肯定不能取。所以我们可以考虑减去一个后的值。判断它的和是奇数还是偶数即可。
int n; cin >> n;int s = 0;for (int i = 1; i <= n; i ++) {int x; cin >> x;s += x - 1;}if (s & 1){cout << "shuai";}else cout << "tian";
B 夏蝉鸣鸣 两心惶惶
夏蝉鸣鸣 两心惶惶
这个题目当时打的时候没有认真看题。错了好多次。轻敌了。下次一定要认真看题目。
这个题的话主要是考了一个字符储存的问题。注意要倒着对这个字符进行更新。记录一下最后一个字符,最后把第一个字符赋给它即可。
下面是代码。
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
constexpr int N = 1e3 + 10;int g[N][N];struct node
{int op, c;
} a[N];void solve()
{int n, m, x, y;cin >> n >> m >> x >> y;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){char ch;cin >> ch;g[i][j] = ch - 'a';}}int p, q;cin >> p >> q;for (int k = 1; k <= q; k++){int op, c;cin >> op >> c;a[k].op = op, a[k].c = c;}while (p --)for (int k = 1; k <= q; k++){int op = a[k].op, c = a[k].c;if (op == 1){int u = g[c][m];for (int i = m; i >= 1; i--){g[c][i] = g[c][i - 1];}g[c][1] = u;}else{int u = g[n][c];for (int i = n; i >= 1; i--){g[i][c] = g[i - 1][c];}g[1][c] = u;}}cout << char('a' + g[x][y]);return;
}signed main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;// cin >> t;while (t--){solve();}return 0;
}
C 田垄恹恹 我心难言
田垄恹恹 我心难言
这个题目我们对 n == 1 和 n == 2 的情况进行特判一下。如果 n == 1 的话很容易知道肯定不可以成立的。对于n == 2 的情况。
1 2 2 1
1 2 这种情况也是不可以的。1 2 这种情况就是去掉 1 或者 2 都行。所以答案是 1
那么对于 n == 3 的时候我们可以玩一下样例就知道
1 2 3
1 2 3 这种情况,就是 1。我们取 2 2 就行了。
1 3 2
1 2 3 这种情况 2 2,也是 1。所以我们判断这两种情况是 1,其他的话,我们可以证明 2 次一定可以完成。你总是可以找到一组满足条件。可以自己玩一下数字看看。
代码
int n;cin >> n;vector<int> a(n + 1);vector<int> b(n + 1);for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= n; i++)cin >> b[i];if (n == 1){cout << -1 << "\n";return ;}else if (n == 2){bool flag = true;for (int i = 1; i <= n; i ++)if (a[i] != b[i]) flag = false;if (flag) {cout << -1 << "\n";return ;}}int ans;bool flag = false;for (int i = 1; i <= n; i++){if ((a[i] == b[i] && i != n && i != 1) || a[i] == b[i + 1] || a[i] == b[i - 1])flag = true;}if (flag)ans = 1;elseans = 2;cout << ans << "\n";
D 淇水汤汤 渐车帷裳
淇水汤汤 渐车帷裳
这个题就跟着题目模拟就行了。感觉没有什么好说的。看代码吧。
int n, m;cin >> m >> n;for (int i = 0; i < m; i++){for (int j = 0; j < n; j++)cin >> g[i][j];}char s;int x, y, k;cin >> x >> y >> s >> k;char tow = s;while (k--){// cout << x << " " << y << "\n";if (tow == 'U'){y -= 1;}else if (tow == 'D'){y += 1;}else if (tow == 'L'){x -= 1;}else{x += 1;}if (tow == 'U'){if (g[x][y]){tow = 'R';g[x][y] = 0;}else{tow = 'L';g[x][y] = 1;}}else if (tow == 'D'){if (g[x][y]){tow = 'L';g[x][y] = 0;}else{tow = 'R';g[x][y] = 1;}}else if (tow == 'L'){if (g[x][y]){tow = 'U';g[x][y] = 0;}else{tow = 'D';g[x][y] = 1;}}else{if (g[x][y]){tow = 'D';g[x][y] = 0;}else{tow = 'U';g[x][y] = 1;}}}cout << x << " " << y;
F 执子之手 与子偕老
执子之手 与子偕老
我们找一下十万以内和甜美互质的数即可。gcd 是一个求最大公约数的函数。
int n; cin >> n;int ans = 0;for (int i = 2; i <= 100000; i ++){if (__gcd(i, n) == 1) ans ++;}cout << ans;
H 子兴视夜 明星有烂
子兴视夜 明星有烂
这个直接让 m / n 即可。因为 c/c++ 是向下取整,所以直接除以即可。
int n, m; cin >> n >> m;cout << m / n;
I 无思远人 劳心怛怛
无思远人 劳心怛怛
背一下诗就好了。哈哈,考试的时候没看题就瞎做,还错了一次。逆天。
string s1 = "床前明月光";string s2 = "疑是地上霜";string s3 = "举头望明月";string s4 = "低头思故乡";string s; cin >> s;if (s == s1) cout << s2;if (s == s2) cout << s1;if (s == s3) cout << s4;if (s == s4) cout << s3;