Codeforces Round #629 (Div. 3) C,D题解

PS:比赛的时候不知道为啥cf网站要么崩溃要么显示速度很慢,交个代码就要好几分钟。。
C题:
大致题意: 给我们一个三进制数X,要求构造三进制数a,b,定义三进制的异或值为xi=(ai+bi)%3。构造的a,b必须满足以下条件。1.a^b=x 2.max(a,b)最小。
思路: 刚开始a1=b1=1,再从2-n遍历,遇到第一个1时a串赋1,b串赋0,之后将所有的数字都放在b。我们可以发现10000>02222,所以选择一边倒。因此这样构造我们可以发现b必定会小于等于a,且a的最大值最小
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=5e4+50;
char x[MAXN];
char a[MAXN],b[MAXN];
int main()
{
    
    
    int t;int n;
    scanf("%d",&t);
    while(t--)
    {
    
    
        scanf("%d",&n);
        scanf("%s",x+1);
        int flag=0;
        a[1]='1';b[1]='1';
        for(int i=2;i<=n;i++)
        {
    
    
            if(flag==0)
            {
    
    
                if(x[i]=='0')
                {
    
    
                    a[i]='0';
                    b[i]='0';
                }
                else if(x[i]=='2')
                {
    
    
                    a[i]='1';
                    b[i]='1';
                }
                else if(x[i]=='1')
                {
    
    
                    a[i]='1';
                    b[i]='0';
                    flag=1;
                }
            }
            else
            {
    
    
                a[i]='0';
                b[i]=x[i];
            }
        }
        for(int i=1;i<=n;i++)
        {
    
    
            printf("%c",a[i]);
        }
        printf("\n");
        for(int i=1;i<=n;i++)
        {
    
    
            printf("%c",b[i]);
        }
        printf("\n");
    }
    return 0;
}

D题:
大致题意: n个动物组成一个环,现在要给环上色,要求使用的颜色种类数量尽可能的少,并且相邻不同的动物不能使用同一种颜色。
思路: 可分为三种情况:
1.只有一种动物,则全部同色。
2.若相邻的动物都是不相同的且,则需要三种颜色,一开始1212涂色,最后一个动物涂3。
3.不满足上面的两种情况,若n为偶数,则12121212…,若n为奇数,因为不满足第二种,则,一定存在相邻是相同动物,那么可以先12,遇到相同的,翻转变成21。
注意:因为这是一个环,所以一定不要忘记判断1和n。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2e5+50;
int t[MAXN],num[MAXN];
int main()
{
    
    
    int q,n;
    scanf("%d",&q);
    while(q--)
    {
    
    
        memset(num,0,sizeof num);
        scanf("%d",&n);
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
    
    
            scanf("%d",&t[i]);
            if(num[t[i]]==0)
            {
    
    
                cnt++;
                num[t[i]]=1;
            }
        }
        if(cnt==1)
        {
    
    
            printf("1\n");
            for(int i=1;i<=n;i++)
            {
    
    
                printf("1 ");
            }
            printf("\n");
            continue;
        }
        t[0]=t[n];t[n+1]=t[1];
        int flag=0;int pos=0;
        for(int i=1;i<=n;i++)
        {
    
    
            if(t[i]==t[i-1])
            {
    
    
                pos=i;
                flag=1;
                break;
            }
        }
        if(flag==0&&(n&1))
        {
    
    
            printf("3\n");
            for(int i=1;i<=(n-1)/2;i++)
            {
    
    
                printf("1 2 ");
            }
            printf("3\n");
        }
        else if(!(n&1))
        {
    
    
            printf("2\n");
            for(int i=1;i<=n/2;i++)
            {
    
    
                printf("1 2 ");
            }
            printf("\n");
        }
        else if(flag&&(n&1))
        {
    
    
            printf("2\n");
            for(int i=1;i<pos;i++)
            {
    
    
                printf("%d ",i%2+1);
            }
            for(int i=pos;i<=n;i++)
            {
    
    
                printf("%d ",2-i%2);
            }
            printf("\n");
        }
    }
    return 0;
}

或许我们没有没别人聪明,但是我们可以努力,付出终将有回报。我们既然选择了ACM这条路,就要用热爱的心走下去。

猜你喜欢

转载自blog.csdn.net/weixin_45755679/article/details/105147832