A. Red Versus Blue
题意:给定R,B的个数,输出R连续少的字符串
题解:B把R分成了(b+1)的段,剩下的R依次加入到前面的段里
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int aa[200];
void solve() {
memset(aa, 0, sizeof(aa));
int n, a, b;
cin >> n >> a >> b;
int x = a / (b + 1);
for (int i = 0; i < b + 1; i++) {
aa[i] += x;
}
int y = a % (b + 1);
for (int i = 0; i < b + 1; i++) {
if (y > 0) aa[i] += 1, y--;
}
for (int i = 0; i < b + 1; i++) {
for (int j = 0; j < aa[i]; j++) cout << 'R';
if (i <= b - 1)
cout << 'B';
}
cout << endl;
}
int main() {
std::cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
}
B. Bit Flipping
题意:给定0,1组成序列,每次可以选择一位不动,k次操作后该序列最大为多少。
题解:若k为奇的情况,在操作数允许的情况下,为1的位置操作1次,若k为偶的情况,在操作允许的情况下,为0的操作1次,多余的操作给最后一位。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3f;
ll aa[200006];
void solve() {
memset(aa, 0, sizeof(aa));
ll n, k;
cin >> n >> k;
string s;
cin >> s;
ll kk = k;
for (int i = 0; i < n && kk>0; i++) {
if (k % 2 == s[i] - '0') aa[i] = 1, kk--;
}
aa[n - 1] += kk;
for (int i = 0; i < n; i++) {
if ((k - aa[i]) % 2 == 1) s[i] = '1' - (s[i] - '0');
cout << s[i];
}
cout << endl;
for (int i = 0; i < n; i++) {
cout << aa[i];
if (i != n - 1) cout << ' ';
}
cout << endl;
}
int main() {
std::cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
}
C. Line Empire
题意:要求攻占所有城池,有两种操作,更换首都所需花费 a*(x[i]-cap),从首都攻占城池b*(x[i]-cap),必须依次攻占,求最少花费。
题解:模拟首都所在的位置,在首都之前的花费(a+b)*(x[pos]-x[1])这样是最优的,即一边攻占,一边转移。首都之后的花费就是各点到该首都位置的花费。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3f;
ll aa[200006];
ll sum[200006];
void solve() {
memset(sum, 0, sizeof(sum));
int n, a, b;
cin >> n >> a >> b;
for (int i = 1; i <= n; i++) cin >> aa[i], sum[i] = sum[i - 1] + aa[i];
ll res = 0;
ll ans = sum[n] * (b);
for (int i = 1; i <= n; i++) {
res += (a + b) * (aa[i] - aa[i - 1]);
ll x = res + (sum[n] - sum[i] - aa[i] * (n - i)) * b;
ans = min(ans, x);
}
cout << ans << endl;
}
int main() {
std::cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
}