A. Chess For Three (思维)
题意:
三个人在一起下棋。每盘棋都有两个人对弈。胜者得 2 2 2 分,负者得 0 0 0 分,如果和棋,双方各得 1 1 1 分。请注意,同一对棋手可能下过任何次数的非负数(可能为零)。也有可能根本没有下过棋。下完所有棋局后,他们的得分分别是 p 1 p_1 p1 、 p 2 p_2 p2 和 p 3 p_3 p3 。此外,可以保证 p 1 ≤ p 2 ≤ p 3 p_1 \leq p_2 \leq p_3 p1≤p2≤p3 成立。
找出可能发生的最大和棋次数,如果无解则输出 − 1 -1 −1 。
分析:
三个人每局对总分数的贡献都是偶数,所以最后分数总和一定是偶数。如果 a + b ≥ c a+b \ge c a+b≥c,那么可以找到一种方法平局 ( a + b + c ) / 2 (a+b+c)/2 (a+b+c)/2次。否则最多平局 a + b a+b a+b次。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int a, b, c;
cin >> a >> b >> c;
int s = a + b + c;
if (s % 2)
cout << -1 << endl;
else
cout << min(s / 2, a + b) << endl;
}
return 0;
}
B.Cat, Fox and the Lonely Array (位运算)
题意:
将 a a a 的孤度定义为:对于任意两个正整数 i i i 和 j j j ( 1 ≤ i , j ≤ n − k + 1 1 \leq i, j \leq n - k +1 1≤i,j≤n−k+1 ),以下条件成立的最小正整数 k k k ( 1 ≤ k ≤ n 1 \le k \le n 1≤k≤n ):
a i ∣ a i + 1 ∣ … ∣ a i + k − 1 = a j ∣ a j + 1 ∣ … ∣ a j + k − 1 , a_i | a_{i+1} | \ldots | a_{i+k-1} = a_j | a_{j+1} | \ldots | a_{j+k-1}, ai∣ai+1∣…∣ai+k−1=aj∣aj+1∣…∣aj+k−1,
即对于连续的 k k k个元素,它们的位相 O R OR OR 应该是相同的。求数组 a a a的孤度
分析:
我们分别对于每一位进行考虑,满足条件 k k k的最小值,为最长连续的 0 0 0的长度加 1 1 1,如果没有 1 1 1,那么这个值是可以任意取的,最后对所有的值取最大值即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin