先自我忏悔,忘记报名了,写完题才意识到没报名不能提交,只能第二天补题了
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;
}
给垃圾少女点个赞吧,评个论吧!