1. 程式人生 > 其它 >2022.4.19

2022.4.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;
}