• 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;
                    }
                }
            }
        }
    }
  • 相关阅读:
    读《疯狂Ajax讲义》重点
    Qt Library 链接库
    html验证码
    java开发webservice
    QT TCP/IP
    Android 开发技术流程
    jquery使用
    多台服务之间共享Session
    JS 混淆加密
    html中的表格 bootstrap-table
  • 原文地址:https://www.cnblogs.com/liyexin/p/12584987.html
Copyright © 2020-2023  润新知