B. BAN BAN
题意:给你一个 \(n\),生成一个字符串为
BAN
重复 \(n\) 遍。每次操作可以选择两个位置进行交换,问至少多少次交换后可以使该串不存在BAN
的子序列。输出方案。
显然对于每个 BAN
都至少要动一下,而每次交换可以动两位,所以答案的下界是 \(\lceil\frac{n}{2}\rceil\)。这个下界是可以达到的,我们只需要交换最左边的 B
和最右边的 N
,再交换第二段的 B
和倒数第二段的 N
,以此类推,结果形如 NANNAN...BABBAB
,显然满足条件。
By Um_nik
void solve() {
int n;
scanf("%d", &n);
int m = (n + 1) / 2;
printf("%d\n", m);
for (int i = 0; i < m; i++) {
printf("%d %d\n", 3 * i + 1, 3 * (n - i));
}
}
int main()
{
startTime = clock();
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
int t;
scanf("%d", &t);
while(t--) solve();
return 0;
}
C. Swap Game
题意:有一个数组 \(a\),Alice 和 Bob 轮流操作(Alice 先手)。每次操作可以选择一个位置 \(i\in[2,n]\),将 \(a_1\) 减去 \(1\) 后交换 \(a_1\) 和 \(a_i\)。操作前遇到 \(a_1=0\) 的局面的人输。
由于是减法运算,可以从最小值入手考虑。如果 \(a_1\) 即为最小值,则 Alice 只能将它减一后换出去,此时 Bob 可以再将它换进来。于是每轮操作 \(a_1\) 都会减少 \(1\),而其他数中选一个减少 \(1\)。由于 \(a_1\) 为最小值,必然先变成 \(0\),所以 Bob 可以胜出。如果 \(a_1\) 不为最小值,则 Alice 可以将最小值换进来,此时 Bob 面临的局面同上,Alice 必胜。
By turmax
#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main()
{
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--)
{
int n;cin>>n;
int a[n];for(int i=0;i<n;++i) cin>>a[i];
puts((a[0]==(*min_element(a,a+n))) ? "Bob" : "Alice");
}
return 0;
}
D. Yet Another Problem
标签:832,int,交换,Alice,最小值,BAN,Div,CFR,Bob From: https://www.cnblogs.com/cxm1024/p/17168428.html题意:给你一个数组 \(a\),每次询问给出一个 \(l,r\),询问将这部分子段全部变成 \(0\) 的最小操作次数。每次操作可以选择一个 \(l',r'(l\le l'\le r'\le r,(l'-r'+1)\text{ is odd})\),使用这段区间的异或和来替换其中每个数。