【CF补题】【ABC】Codeforces Round #782 (Div. 2) C++代码

先自我忏悔,忘记报名了,写完题才意识到没报名不能提交,只能第二天补题了


A. Red Versus Blue

【题目】

红队和蓝队参加了竞争激烈的 FPS。 他们的比赛在世界各地进行了直播。 他们进行了一系列 n 场比赛。

结果红队赢了r次,蓝队赢了b次。 蓝队的技术不如红队,所以 b 严格小于 r。

你因为睡过头就错过了直播,但你认为这场比赛一定是并驾齐驱的,因为有这么多人看。 所以你想象一个长度为 n 的字符串,其中第 i 个字符表示谁赢得了第 i 场比赛——如果红队获胜,则为 R,如果蓝队获胜,则为 B。 您可以想象这个字符串是这样的,即一个团队连续获胜的最大次数尽可能少。 例如,在RBBRRRRB系列赛中,红队连续3次获胜,这是最多的。

您必须找到满足上述条件的字符串。 如果有多个答案,打印任何一个。

【解答】没啥好说的

#include<bits/stdc++.h>
using namespace std;
int n, r, b, p;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t;
	cin >> t;
	while (t--)
	{
		cin >> n >> r >> b;
		int k = b + 1;
		for (int i = 1; i <= b + 1; i++)
		{
			int cntr = r / k;
			r = r - cntr;
			k--;
			while (cntr--)cout << 'R';
			if (i != b + 1)cout << 'B';
		}
		cout << '\n';
	}
	return 0;
}

B. Bit Flipping

【题目】

给定一个长度为 n 的二进制字符串。 你正好有 k 步。 在一次移动中,您必须选择一个位。 除该位之外的所有位的状态都将被翻转(0 变为 1,1 变为 0)。 您需要输出使用所有 k 移动后可以获得的字典顺序最大的字符串。 此外,输出您将选择每个位的次数。 如果有多种方法可以做到这一点,您可以输出其中任何一种。

当且仅当满足以下条件时,二进制字符串 a 在字典上大于相同长度的二进制字符串 b:

在 a 和 b 不同的第一个位置,字符串 a 包含一个 1,而字符串 b 包含一个 0。

【思考】

模拟,如果这点翻转k次后是0,这一点就要少翻转一次,如果扫描一遍k=0了(也可能一遍都扫描不完),就结束了。

扫描一遍后,所有点都是1。但还有k’次翻转,

1.k是偶数,那么加在哪里都可以。

2.k是奇数,最后一位少翻转一次。1111111-->1111110

#include<bits/stdc++.h>
using namespace std;
int n, r, b, p;
bool a[200010];
int ans[200010];
int main() 
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	int k;
	char c;
	cin>>t;
	while (t--) 
	{
		memset(ans,0,sizeof(ans));
		cin >> n >> k;
		int kk=k;
		for (int i = 1; i <= n; i++) 
		{
			cin >> c;
			a[i] = c - '0';
		}
		int flag=1;
		int i=1;
		while(k!=0 && flag)
		{
			if((a[i] + (kk-ans[i]) )%2 != 1) 
			{
				ans[i]++;
				k--;
			}
			i++;
			if(i > n) {
				flag=0; 
			}
		}
		if(flag == 0 && k > 0)
		{
			ans[n]+=k;
		}
		
		for(int i=1;i<=n;i++) cout << (a[i]+(kk-ans[i]))%2 ;
		cout<<'\n';
		for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
		cout<<'\n';
	}
	return 0;
}

 C. Line Empire

【题目】C. Line Empire

占领操作有成本,移动操作有成本,只能从前向后一个一个打,区别就在于是否移动


【思考】贪心的思想,每一步考虑:当移动的成本小于不移动时攻打所增加的成本就动,否则不动,

成本的计算方法:

(在xA点攻打全部国家的代价)-(在xB点攻打全部国家的代价)是b*((y1-a)-(y1-b))+...=kb*(B-A)

而从A点移动到B点的代价是a*(B-A)

二者对比。

注意:从x0-x1-x2移动的成本,和x0-x2移动的成本是一样的,区别就在于攻打的时候的消耗,如果攻打后面所有的国家所产生的代价太大,那么就先移动,缩小攻打成本,如果移动的代价太大了,还不如直接打,那么就别动。

#include<bits/stdc++.h>
using namespace std;
int n;
long long a, b, val[200005];
long long ans;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int t;
	cin >> t;
	while (t--) 
	{
		cin >> n >> a >> b;
		long long now = 0, ans = 0;
		for (int i = 1; i <= n; i++) 
		{
			cin >> val[i];
			ans += b * (val[i] - val[now]);
			if ((n - i)*b >= a) 
			{
				ans += a * (val[i] - val[now]);
				now = i;
			}
		}
		cout << ans << '\n';
	}
	return 0;
}

给垃圾少女点个赞吧,评个论吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值