情况
时间:2024年7月28日22:35
题解
A
题意
奇数元素个数的数组。能去掉相邻两个元素,最后剩下最大?
思路
偶数位置必删,找奇数位置的最大值。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void solve() { int n; cin >> n; vector<int> a(n); vector<int> b(n); for (int i = 0; i < n; ++i) { cin >> a[i]; if (i % 2 == 0) b.push_back(a[i]); } sort(b.begin(), b.end()); cout << b[b.size() - 1] << endl; }
|
B
题意
好数组: bi=ai&ai+1 按位与。
给出b,输出一种a或不存在
思路
我的思路:先找能否有:条件是连续三个数相同位置不能 1 0 1
之后再输出:从后往前,ai+1或等于bi,ai=bi
别人:直接实现。ai = bi | bi-1 ,再检查bi=ai&ai+1,
不行就没有。
代码
fool’s v
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| bool hasInvalidPattern(int number1, int number2, int number3)
{ for (int i = 0; i < 30; ++i) { bool bit1 = (number1 >> (i)) & 1; if (bit1 == 0) { continue; } bool bit2 = (number2 >> (i)) & 1; bool bit3 = (number3 >> (i)) & 1;
if (bit1 == 1 && bit2 == 0 && bit3 == 1) { return true; } } return false; } void solve() { int n; cin >> n; vector<int> b(n - 1); vector<int> ans(n); for (int i = 0; i < n - 1; i++) cin >> b[i]; for (int i = 0; i < n - 3; i++) { if (hasInvalidPattern(b[i], b[i + 1], b[i + 2])) { cout << "-1" << endl; return; } } ans[n - 1] = b[n - 2];
for (int i = n - 2; i >= 0; i--) { ans[i + 1] |= b[i]; ans[i] = b[i]; } for (int i = 0; i < n; i++) cout << ans[i] << " "; cout << endl; }
|
REN_REN
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| int n, m;
void solve() { cin >> n; vector<int> aa(n + 1), bb(n + 1); int ans = 0; for (int i = 1; i <= n - 1; i++) { cin >> bb[i]; } for (int i = 1; i <= n; i++) { aa[i] = bb[i] | bb[i - 1]; } for (int i = 1; i <= n - 1; i++) { if ((aa[i] & aa[i + 1]) != bb[i]) { cout << "-1\n"; return; } } for (int i = 1; i <= n; i++) { cout << aa[i] << ' '; } cout << '\n'; }
|
C
题意
数组,给出操作:
选一个数,然后所有元素减去它,取绝对值。
四十次之内完成,要不然就输出-1.不用强求最少次数。
思路
贪心+模拟。每次减去最大值和最小值的均值。
不存在的情况:存在两个数奇偶性不相等。
正解,jiangly直接用2对折,2的30次到1来缩小数的范围,再讨论奇偶。解决
代码
fool
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| void solve() { int n; std::cin >> n;
std::vector<int> a(n); for (int i = 0; i < n; i++) { std::cin >> a[i]; }
for (int i = 1; i < n; i++) { if (a[i] % 2 != a[0] % 2) { std::cout << -1 << "\n"; return; } }
std::cout << 30 + (a[0] % 2 == 0) << "\n"; for (int i = 29; i >= 0; i--) { std::cout << (1 << i) << " "; } if (a[0] % 2 == 0) { std::cout << 1; } std::cout << "\n"; }
|
jiangly
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| void solve() { int n; std::cin >> n;
std::vector<int> a(n); for (int i = 0; i < n; i++) { std::cin >> a[i]; }
for (int i = 1; i < n; i++) { if (a[i] % 2 != a[0] % 2) { std::cout << -1 << "\n"; return; } }
std::cout << 30 + (a[0] % 2 == 0) << "\n"; for (int i = 29; i >= 0; i--) { std::cout << (1 << i) << " "; } if (a[0] % 2 == 0) { std::cout << 1; } std::cout << "\n"; }
|
D
题意
1到n的数,两个数之间按位异或是素数,则有边连接。如何给1-n涂色,一个边不能连相同颜色。
思路
对于n≥6的情况,把1n按mod 4分为4组(分别余14),则同组互相异或都是4的倍数,这些数可以为1种颜色因为没有边,所以至多4种颜色。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| void solve() { int n; cin >> n; if (n == 1) { cout << 1 << endl; cout << 1 << endl; } else if (n == 2) { cout << 2 << endl; cout << 1 << ' ' << 2 << endl; } else if (n == 3) { cout << 2 << endl; cout << 1 << ' ' << 2 << ' ' << 2 << endl; } else if (n == 4) { cout << 3 << endl; cout << 1 << ' ' << 2 << ' ' << 2 << ' ' << 3 << endl; } else if (n == 5) { cout << 3 << endl; cout << 1 << ' ' << 2 << ' ' << 2 << ' ' << 3 << ' ' << 3 << endl; } else if (n == 6) { cout << 4 << endl; cout << 1 << ' ' << 2 << ' ' << 2 << ' ' << 3 << ' ' << 3 << ' ' << 4 << endl; } else { cout << 4 << endl; for (int i = 1; i <= n; ++i) cout << ((i+3) % 4)+1 << ' '; cout << endl; } }
|
问题
哎,本场最大笑话。wa试答案