CFR-832-Div-2解题报告

B. BAN BAN

题意:给你一个 n,生成一个字符串为 BAN 重复 n 遍。每次操作可以选择两个位置进行交换,问至少多少次交换后可以使该串不存在 BAN子序列。输出方案。

显然对于每个 BAN 都至少要动一下,而每次交换可以动两位,所以答案的下界是 n2。这个下界是可以达到的,我们只需要交换最左边的 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[2,n],将 a1 减去 1 后交换 a1ai。操作前遇到 a1=0 的局面的人输。

由于是减法运算,可以从最小值入手考虑。如果 a1 即为最小值,则 Alice 只能将它减一后换出去,此时 Bob 可以再将它换进来。于是每轮操作 a1 都会减少 1,而其他数中选一个减少 1。由于 a1 为最小值,必然先变成 0,所以 Bob 可以胜出。如果 a1 不为最小值,则 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

题意:给你一个数组 a,每次询问给出一个 l,r,询问将这部分子段全部变成 0 的最小操作次数。每次操作可以选择一个 l,r(llrr,(lr+1) is odd),使用这段区间的异或和来替换其中每个数。

posted @   曹轩鸣  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起