Codeforces Round #629 (Div. 3)

    地址:https://codeforces.com/contest/1328

     题意:a,b。a只能+1操作。求最少几步能整除b

     解析:分类讨论即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n,m;
        cin>>n>>m;
        if(n%m==0)
            cout<<"0"<<endl;
        else
        {
            if(n<m)
                cout<<m-n<<endl;
            else
            {
                ll mid=n/m;
                cout<<m*(mid+1)-n<<endl;
            }
        }
    }
}

     题意:长为n的只含a,b的字符串,含有2个b,n-2个a。给出k,求第k大的字符串。输出它

     解析:规律题。。。这些字符串就是按字典序排列的。上图n=5,这张图是从右往左来记下标,表示每次b的两个出现位置。

    L每次就成了一组等差数列:1,1,2,1,2,3,1,2,3,4.....而且发现,每个等差数列的和,恰好对应==k。根据d=1的等差数列求和公式(i*i+i)/2,找出第一个>=k的,这个i值,就是L下标的最大情况,L+1,就是R了。这个R是精准的。但是L怎么求?根据观察,实际的L就等于L-((L*L+L)/2-K)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e5+20;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n,m;
        cin>>n>>m;
        ll l,r;
        for(ll i=1;i<=n;i++)
        {
            if(i*i+i>=2*m)
            {
                l=i;break;
            }
        }
        ll md=(l*l+l)/2;
        r=l-((l*l+l)/2-m);
        for(ll i=n;i>=1;i--)
        {
            if(i==r||i==l+1)
                cout<<"b";
            else
                cout<<'a';
        }
        cout<<endl;
    }
}

     题意:给出长度为n的x,这个x开头必须是2,其他部分由0,1,2组成。求出长度同为n的两个数a,b,要求每一位xi==(ai+bi)%3,而且开头不为0。要求max(a,b)最小。

     解析:往a,b那平分就行了。把它们当字符串处理,所以就是个字典序问题。每次比较a,b的大小,把数字尽量往它们身上平分。a!=b的话,大的给小,小的给大。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e5+20;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        string s;
        cin>>s;
        string c1,c2;
        for(int i=0;i<s.length();i++)
        {
            if(i==0)
            {
                c1+='1';
                c2+='1';
            }
            else
            {
                if(s[i]=='2')
                {
                    if(c1>c2)
                    {
                        c1+='0';
                        c2+='2';
                    }
                    else if(c1==c2)
                    {
                        c1+='1';
                        c2+='1';
                    }
                    else
                    {
                        c1+='2';
                        c2+='0';
                    }
                }
                if(s[i]=='1')
                {
                    if(c1>c2)
                    {
                        c1+='0';
                        c2+='1';
                    }
                    else
                    {
                        c1+='1';
                        c2+='0';
                    }
                }
                if(s[i]=='0')
                {
                    c1+='0';
                    c2+='0';
                }
            }
        }
        cout<<c1<<endl<<c2<<endl;
    }
}

     题意:n个动物,给出编号,不同编号表明不是同一种动物。要求给它们染色,保证相邻不相同的不能染同一种颜色。输出所需最少颜色数以及染色结果。!注意是个环!

     解析:1:对于n是偶数的情况,那么只需要两种染料,1,2,1,2依次染就可以了。

        2:n是奇数的话,如果没有出现两个相邻的是同一种动物,就需要三种燃料,1,2,1,2......3结尾染成3就可以了。

        3:n是奇数,如果出现了两个相邻的是同一种动物(环,首尾相同也算),那么把它俩合并染上同一种颜色,那么总的就成偶数个了。1,2,1,2依次染下去就行了,总的燃料数是2。我这里为了避免麻烦,先判断了首尾相同的情况,没有的话再判断中间情况。注意,此题细节颇多,模拟的时候头脑一定要清晰。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=2e5+10;
int a[maxn],b[maxn];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int ok1=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(i>1&&a[i]!=a[i-1])
                ok1=1;
        }
        if(!ok1)
        {
            cout<<"1"<<endl;
            for(int i=1;i<=n;i++)
            {
                if(i<n)
                    cout<<"1"<<" ";
                else
                    cout<<"1"<<endl;
            }
        }
        else if(n%2==0)
        {
            cout<<"2"<<endl;
            for(int i=1;i<=n;i++)
            {
                if(i<n)
                {
                    if(i%2!=0)
                        cout<<"1"<<" ";
                    else
                        cout<<"2"<<" ";
                }
                else
                {
                    if(i%2!=0)
                        cout<<"1"<<endl;
                    else
                        cout<<"2"<<endl;
                }
            }
        }
        else
        {
            if(a[1]==a[n])
            {
                cout<<"2"<<endl;
                cout<<"1"<<" ";
                for(int i=2;i<n;i++)
                {
                    if(i%2==0)
                        cout<<"2"<<" ";
                    else
                        cout<<"1"<<" ";
                }
                cout<<"1"<<endl;
            }
            else
            {
                int k=-1;
                for(int i=1;i<n;i++)
                {
                    if(a[i]==a[i+1])
                    {
                        k=i;break;
                    }
                }
                if(k==-1)
                {
                    cout<<"3"<<endl;
                    for(int i=1;i<n;i++)
                    {
                        if(i%2!=0)
                            cout<<"1"<<" ";
                        else
                            cout<<"2"<<" ";
                    }
                        cout<<"3"<<endl;
                }
                else
                {
                    memset(b,0,sizeof(b));
                    cout<<"2"<<endl;
                    if(k%2!=0)
                        b[k]=1,b[k+1]=1;
                    else
                        b[k]=2,b[k+1]=2;
                    
                    for(int i=1;i<k;i++)
                    {
                            if(i%2!=0)
                                b[i]=1;
                            else
                                b[i]=2;
                    }
                    for(int i=k+2;i<=n;i++)
                    {
                        if(i%2!=0)
                            b[i]=2;
                        else
                            b[i]=1;
                    }
                    for(int i=1;i<n;i++)
                        cout<<b[i]<<" ";
                        cout<<b[n]<<endl;
                }
            }
        }
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/12584987.html