A. Red Versus Blue
每一次循环都计算R和B的比例,然后输出t个R,一个B,每次输出都判断是否结束
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;
void mian()
{
int n, a, b;
cin >> n >> a >> b;
while (n)
{
int t = 1.0 * a / (b + 1) + 0.99;
for (int i = 1; i <= t; i++)
{
cout << "R";
n--;
if (n == 0)
break;
a--;
}
if (n == 0)
break;
cout << "B";
n--;
b--;
}
cout << endl;
}
int main()
{
int T;
cin >> T;
while (T--)
{
mian();
}
return 0;
}
B. Bit Flipping
题目要求是可以将一位不变,可以转换一下这种情况为使一位发生变化。但是次数要求是偶数次,所以如果k为奇数,就将全部位转换一下。
然后可以发现有k次机会使一位发生变化,最后剩余的次数全部给最低位即可。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;
void mian()
{
int n, k;
string s;
cin >> n >> k;
cin >> s;
if (k == 0)
{
cout << s << endl;
for (int i = 1; i <= n; i++)
{
cout << "0" << ' ';
}
cout << endl;
}
else
{
if (k % 2)
{
for (int i = 0; i < s.size(); i++)
{
s[i] ^= 1;
}
}
vector<int> ans(n);
for (int i = 0; i < s.size() - 1; i++)
{
if (k == 0)
break;
if (s[i] == '0')
{
s[i] = '1';
k--;
ans[i] = 1;
}
else
ans[i] = 0;
}
if (k % 2)
{
s[s.size() - 1] ^= 1;
}
ans[n - 1] = k;
cout << s << endl;
for (auto i : ans)
{
cout << i << ' ';
}
cout << endl;
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
mian();
}
return 0;
}
C. Line Empire
题意:X轴上有n个城市,自己主城在0处,可以花费b乘上主城与另一个城市之间的距离来攻占掉,也可以花费a乘两地距离来迁都。迁都只能迁到已经攻占的地方,攻占不能跳过其他城市攻占,求花费最小多少。
如果不迁都,那么以后每次攻占都要计算上这一段距离,那么可以算一下还有几个城要攻占乘上权值b,与权值a进行比较,如果比a大那么就要迁都。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#define endl '\n'
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll x[N];
void mian()
{
ll n, a, b, pos = 0;
ll res = 0;
cin >> n >> a >> b;
for (int i = 1; i <= n; i++)
{
cin >> x[i];
}
res += x[1] * b;
for (int i = 2; i <= n; i++)
{
if ((n - i + 1) * b > a)
{
res += a * (x[i - 1] - pos);
pos = x[i - 1];
}
res += b * (x[i] - pos);
}
cout << res << endl;
}
int main()
{
int T;
cin >> T;
while (T--)
{
mian();
}
}
D. Reverse Sort Sum
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#define endl '\n'
using namespace std;
const int N = 1e5+10;
void mian()
{
int n;
cin >> n;
vector<int> a(n, 1);
vector<int> c(n);
for (int i = 0; i < n; i++)
{
cin >> c[i];
}
for (int i = 0; i < n; i++)
{
if (c[i] == 0)
{
a[i] = 0;
}
else if (c[i] < n)
{
a[c[i]] = 0;
c[c[i]] += c[i];
}
}
for (int i = 0; i < n; i++)
{
cout << a[i] << ' ';
}
cout << endl;
}
int main()
{
int T;
cin>>T;
while(T--)
{
mian();
}
return 0;
}