Codeforces Round #782 (Div. 2)

题目链接

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();
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值