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;
}

 

posted @ 2020-06-13 11:31  一只幽灵飘过  阅读(134)  评论(0编辑  收藏  举报