A. 我们只需要构造出(b+1)块区间用'B'隔开即可
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n,r,b;cin>>n>>r>>b;
int cnt1=r/(b+1);
int cnt2=r%(b+1);
if(cnt2){
for(int i=1;i<=cnt1+1;i++){
cout<<'R';
}
}
else {
for(int i=1;i<=cnt1;i++){
cout<<'R';
}
}
for(int i=1;i<=b;i++){
cout<<'B';
if(i<cnt2){
for(int j=1;j<=cnt1+1;j++)cout<<'R';
}
else{
for(int j=1;j<=cnt1;j++)cout<<'R';
}
}
cout<<endl;
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
B. 正难则反 因为每个数都要异或k次 但是我们可以让某些数字少异或
如果K是奇数 我们就让1少异或一次 否则就让0少异或一次 剩下的都堆给最后以为 反正最后一位除了0就是1
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n,k;cin>>n>>k;
string s;cin>>s;
vector<int> f(n,0);
int tmpk=k;
for(int i=0;i<n&&tmpk>0;i++)
{
if(k%2==s[i]-'0')
{
f[i]=1;
tmpk--;
}
}
f[n-1]+=tmpk;
for(int i=0;i<n;i++)
{
if((k-f[i])%2==1)s[i]='1'-(s[i]-'0');
}
cout<<s<<endl;
for(auto& e:f) cout<<e<<" ";
cout<<endl;
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
C. 我们先要想什么时候应该需要换首都呢 换首都的消耗 w1=a(l-r), 节约的 w2=(n-i)*b*(l-r)所以w1<w2的时候我们就更新首都
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int x[N];
void solve(){
ll n,a,b;cin>>n>>a>>b;
for(int i=1;i<=n;i++)cin>>x[i];
ll now=0,ans=0;
for(int i=1;i<=n;i++){
ans+=b*(x[i]-x[now]);
if(a<b*(n-i)){
ans+=a*(x[i]-x[now]);
now=i;
}
}
cout<<ans<<'\n';
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
D. 以后再说