2022.4.19
阿新 • • 發佈:2022-04-19
Codeforces Round #782 (Div. 2)
A. Red Versus Blue
直接挨個插空到沒有為止
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=1e5+10,INF=1e9; int cnt[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while(t--) { memset(cnt, 0, sizeof cnt); int n,a,b; cin >>n >> a >> b; int x = a+1; int tt = 0; while(x--) { cnt[tt]++; if(tt==b+1) tt = 1; else tt++; } for (int i = 1; i <= b + 1;i++) { for (int j = 1; j <= cnt[i];j++) { cout << "R"; } if(i!=b+1)cout << "B"; } cout << "\n"; } return 0; }
B - Bit Flipping
每次操作會固定一個數不動而其他數反轉,對於一個數最終是0還是1由總的操作次數減去在該位的操作次數決定。如果結果為偶數該位不變,否則改變。分k為奇數還是偶數兩種情況,如果k為奇數,對於1我們希望該位保持不動因此我們消耗一次,當次數為0的時候剩下的數為奇數直接異或即可。當k為偶數時,我們希望0改變成1,因此進行相同的操作。如果最後還有剩餘的次數,基於貪心,最後一位的影響是最小的,因此把剩餘的次數都加到最後一位去。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=2e5+10,INF=1e9; int cnt[N]; char a[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while(t--) { int n,k; cin>>n>>k; for (int i = 1; i <= n;i++) { cin >>a[i]; cnt[i] = 0; } if(k&1) { for (int i = 1; i <= n;i++) { if(a[i]=='1'&&k) { k--; cnt[i] = 1; } else a[i] ^= 1; } } else { for (int i = 1; i <= n;i++) { if(a[i]=='0'&&k) { cnt[i] = 1; a[i] = '1'; k--; } } } if(k) { cnt[n] += k; if(k&1) a[n] ^= 1; } for (int i = 1; i <= n;i++) { cout << a[i]; } cout << '\n'; for (int i = 1; i <= n;i++) { cout << cnt[i] << ' '; } cout <<'\n'; } return 0; }
C - Line Empire
有兩種操作,操作1是佔領一個國家消耗為b(posj-posi),操作2是更換首都,消耗為a(posj-posi)。我們可以列舉最後首都在哪個位置,預處理出字首和,對於每個i,其後面的消耗為 b⋅((xi+1−xi)+(xi+2−xi)+…+(xj−xi)),即(sum[n] - sum[i] - pos[i] * (n - i)) * b。然後是將首都換到該位的消耗,會發現不論怎麼換,最後的消耗都是(posi-0)a,同理消耗的b也為(posi)b,最小值更新為ans=min(ans,tmp1+tmp2+tmp3)。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=2e5+10,INF=1e9; ll pos[N],sum[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while(t--) { int n,a,b; cin>>n>>a>>b; for (int i = 1; i <= n;i++) { cin >>pos[i]; sum[i] = sum[i - 1] + pos[i]; } ll ans = 1e18; for (int i = 1; i <= n;i++) { ll res1 = (sum[n] - sum[i] - pos[i] * (n - i)) * b; ll res2 = (pos[i]) * b; ll res3 = (pos[i]) * a; ans = min(ans, res1 + res2 + res3); } cout << ans << '\n'; } return 0; }