其他分享
首页 > 其他分享> > 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;
}

标签:typedef,19,cin,long,int,cnt,2022.4,include
来源: https://www.cnblogs.com/menitrust/p/16165480.html