zoukankan      html  css  js  c++  java
  • 2020.06.09——习题训练五

    A - Sum of Odd Integers

    给定两个数n,k,判断n能否是k个不同的奇数的和

    如果n为偶数,则k必须也为偶数才能成立;n为奇数,k也为奇数

    还得保证最小的k个奇数的和,小于等于n

    int main()
    {
        long long t,a,b;
        cin>>t;
        while(t--){
            cin>>a>>b;
            if(a%2 != b%2){
                cout<<"NO"<<endl;
            }else{
                if(a<b*b){
                cout<<"NO"<<endl;
                }else{
                cout<<"YES"<<endl;
                }
            }
        }
        return 0;
    }

    B - Princesses and Princes

    有n个公主和n个王子,每个公主都有心仪王子的清单,从这个列表上选一个靠前的且没有婚配的王子,做好标记,

    如果最后都能婚配输出OPTIMAL,如果不能,输出任意一个没有婚配的公主和王子

    int b[100010]={0},a[100010]={0},c[100010]={0};
    int main()
    {
         int n,t,i,j,n2;
        cin>>t;
        while(t--)
        {
    
            cin>>n;
            for(i=1; i<=n; i++)
            {
                cin>>n2;
                for(j=1; j<=n2; j++)
                {
                    cin>>a[j];
                }
                for(j=1; j<=n2; j++)
                {
                    if(b[a[j]]==0)
                    {
                        b[a[j]]=1;
                        c[i]=1;
                        break;
                    }
                }
    
            }
            int flag=0;
            for(i=1;i<=n;i++){
                if(c[i]==0){
                    cout<<"IMPROVE"<<endl;
                    for(j=1;j<=n;j++){
                        if(b[j]==0){
                            cout<<i<<" "<<j<<endl;
                            flag=1;
                            break;
                        }
                    }
                    if(j!=n+1){
                        break;
    
                    }
                }
            }
            if(flag==0)
            cout<<"OPTIMAL"<<endl;
            for(i=1;i<=n;i++){
                a[i]=0;
                b[i]=0;
                c[i]=0;
            }
         }
        return 0;
    }

    C - EhAb AnD gCd

    给定一个x,输出满足gcd(a,b)+lcm(a,b)=x 的a,b

    即输出1和x-1即可

    int main()
    {
        long long t,a,b;
        cin>>t;
        while(t--){
            cin>>a;
            cout<<1<<" "<<a-1<<endl;
        }
        return 0;
    }

    D - CopyCopyCopyCopyCopy

    给定一个长度为n的数组,将数组重复n次,求最大递增子序列的长度(子序列可以不是连续的)

    求出有多少个不同的元素即可

    int main()
    {
        int t,b,ccc,n,i;
        cin>>t;
        while(t--){
            cin>>n;
            set<int> a;
            ccc=0;
            for(i=0;i<n;i++){
                cin>>b;
                if(a.find(b)==a.end()){
                    a.insert(b);
                    ccc++;
                }
            }
            cout<<ccc<<endl;
        }
        return 0;
    }

    F - Yet Another Tetris Problem

    给定n个方块的高度,额外还有很多高度为2的方块,能否消去所有行

    全部为奇数或全部为偶数就可以消去(差别才能是2的倍数)

    int main()
    {
        int t,n,a,b,c,i;
        cin>>t;
        while(t--){
            cin>>n;
            a=0,b=0;
            for(i=0;i<n;i++){
                cin>>c;
                if(c%2==0){
                    a++;
                }else{
                    b++;
                }
            }
            if(a==n||b==n){
                cout<<"YES"<<endl;
            }else{
                cout<<"NO"<<endl;
            }
        }
        return 0;
    }

    G - Yet Another Palindrome Problem

    求一个数列能否有长度大于三的回文子数列(顺序不能改变,可以不连续)

    找是否存在两个不相邻的相同元素

    int main()
    {
         int n,t,i,b[5100];
         cin>>t;
         while(t--){
            cin>>n;
            int flag=0,a[5100]={0};
            for(i=0;i<n;i++){
                cin>>b[i];
                a[b[i]]++;
                if(a[b[i]]>=2){
                    if(a[b[i]]==2){
                        if(b[i]!=b[i-1]){
                             flag=1;
                        }
                    }else{
                         flag=1;
                    }
    
                }
            }
            if(flag==1){
                cout<<"YES"<<endl;
            }else{
                cout<<"NO"<<endl;
            }
         }
        return 0;
    }

    H - Frog Jumps

    给定一个长度为n的字符串,只由L、R构成,在R上只能向右跳,在L上只能向左跳,从0跳到N+1,每次最多跳长度d,求d的最小值

    给这个字符串的左右两端都加上R,遍历求相近两个R距离的最大值

    int main()
    {
         int n,t,i,b[5100];
         cin>>t;
         while(t--){
            string s="R",s1;
            cin>>s1;
            s+=s1;
            n=s.length();
            s+='R';
            //cout<<s<<endl;
            int maxx=0,flag=0;
            for(i=0;i<n+1;i++){
                if(s[i]=='R'){
                    maxx=max(maxx,i-flag);
                    //cout<<maxx<<endl;
                    flag=i;
                }
            }
            cout<<maxx<<endl;
         }
        return 0;
    }
  • 相关阅读:
    转 方法多态与Duck typing;C#之拙劣与F#之优雅
    Steve Jobs explains objectoriented programming
    c# 之 dynamic关键字
    Eric Schmidt 之关于 Steve Jobs
    面向过程vs面向对象
    转 命令,不要去询问(Tell, Don’t Ask)
    转 函数式编程的10年演化:越来越纯
    网络流学习笔记——简单题
    网络流学习笔记——难题
    线性代数学习笔记
  • 原文地址:https://www.cnblogs.com/a-specter/p/13112276.html
Copyright © 2011-2022 走看看