A题
本题是要求将题目所给的数组分成两组,分为s1和s2,使得|sum(s1)|−|sum(s2)|的值最大。
思路:
我们可以看出,要想使两边数组之和最大,直接使负数和非负数分即可,用较大的减去较小的即可。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int N = 100010;
int T;
signed main()
{
cin >> T;
while(T--)
{
int n;
scanf("%lld", &n);
int s1 = 0, s2 = 0;
for (int i = 0; i < n; ++ i) {
int x;
scanf("%lld", &x);
if(x >= 0) s1 += x;
else s2 -= x;
}
if(s1 > s2) printf("%lld\n", s1 - s2);
else printf("%lld\n", s2 - s1);
}
return 0;
}
B题
本题是求n个 "BAN" ,要经过对调转换使得字符串中找不到BAN的字串,要求步数最小。
思路:
直接将'B' 和'N' 所在位置(B从前开始换, N从后开始换),直到没有"BAN"为止。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 110;
int T;
signed main()
{
scanf("%d", &T);
int n;
while(T--)
{
scanf("%d", &n);
int ans = 0;
ans = n % 2 == 0 ? n / 2 : n / 2 + 1;
printf("%d\n", ans);
n *= 3;
int l = 1, r = n;
while(ans--)
{
printf("%d %d\n", l, n);
l += 3, n -= 3;
}
}
return 0;
}
C题
Problem - C - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/contest/1747/problem/C题意:
本题是一个游戏,Alice和Bob轮流,Alice先手,每次可以将a[1] - 1并与其他元素对换,求最终的胜利者。
思路:
经过分析我们可以看出一个规律,那就是判断初始数组中最小值的位置即可,如果最小值在a[1]处,那么Bob赢,否则Alice赢。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
int T;
signed main()
{
scanf("%d", &T);
int n;
while(T--)
{
scanf("%lld", &n);
int x, mi = 0x3f3f3f3f, fis = 0;
for (int i = 0; i < n; ++ i) {
scanf("%lld", &x);
mi = min(mi, x);
if(fis == 0) fis = x;
}
if(mi == fis) puts("Bob");
else puts("Alice");
}
return 0;
}