A.Guess the Maximum(枚举)
题意:
爱丽丝和鲍勃想出了一个相当奇怪的游戏。他们有一个整数数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,…,an。爱丽丝选择了某个整数 k k k并告诉了鲍勃,然后就发生了下面的事情:
- 鲍勃选择两个整数 i i i和 j j j( 1 ≤ i < j ≤ n 1\le i\lt j\le n 1≤i<j≤n),然后找出整数 a i , a i + 1 , … , a j a_i,a_{i+1},\ldots,a_j ai,ai+1,…,aj中的最大值;
- 如果得到的最大值严格大于 k k k,则爱丽丝获胜,否则鲍勃获胜。
请帮助爱丽丝找出保证她获胜的 k k k的最大值。
分析:
为了最大值尽可能小,爱丽丝会选择所有区间最大值的最小值 − 1 -1 −1,那么选择的连续子串越短越优。注意到区间长度越大,这个区间的最大值是随着它不减的,所以如果鲍勃要让爱丽丝选的最小的话,区间长度一定是 2 2 2。
枚举所有长度为 2 2 2的连续子串,求出它们最大值的最小值,然后减去 1 1 1输出即可。
代码:
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int N = 1e6 + 10;
LL n, a[N];
void solve() {
LL ans = 1e9;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (i > 1)
ans = min(ans, max(a[i], a[i - 1]));
}
cout << ans - 1 << endl;
}
int main() {
int t;
cin >> t;
while (t--)
solve();
return 0;
}
B.XOR Sequences(数学)
题意:
给你两个不同的非负整数 x x x和 y y y。考虑两个无穷序列 a 1 , a 2 , a 3 , … a_1,a_2,a_3,\ldots a1,a2,a3,…和 b 1 , b 2 , b 3 , … b_1,b_2,b_3,\ldots b1,b2,b3,…,其中
- a n = n ⊕ x a_n=n\oplus x an=n⊕x
- b n = n ⊕ y b_n=n\oplus y bn=n⊕y
x ⊕ y x\oplus y x⊕y表示整数 x x x和 y y y的按位异或运算。
例如,有了 x = 6 x=6 x=6之后,序列 a a a的前 8 8 8个元素将如下所示: [ 7 , 4 , 5 , 2 , 3 , 0 , 1 , 14 , … ] [7,4,5,2,3,0,1,14,\ldots] [7,4,5,2,3,0,1,14,…]。请注意,元素的索引以 1 1 1开始。
你的任务是找出序列 a a a和 b b b的最长公共子段 † ^\dagger †的长度。换句话说,求某个 i , j ≥ 1 i,j\ge 1 i,j≥1的最大整数 m m m,使得 a i = b j , a i + 1 = b j + 1 , … , a i + m − 1 = b j + m − 1 a_i=b_j,a_{i+1}=b_{j+1},\ldots,a_{i+m-1}=b_{j+m-1} ai=bj,ai+1=bj+1,…,ai+m−1=bj+m−1。
† ^\dagger †序列 p p p的一个子段是序列 p l , p l + 1 , … , p r p_l,p_{l+1},\ldots,p_r pl,pl