Codeforces Round #626

A. Even Subset Sum Problem

题目描述
题意:找n个数中找最少的数,是他们的和为偶数。
只有一个奇数,输出-1;
如果偶数,就输出一个偶数的下标;
如果没有偶数,就输出两个奇数的下标。
CODE:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        int i,n;
        cin>>n;
        int a[110];
        int sumj=0,sume=0;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
            if(a[i]&1)
                sumj++;
            else if(!sume)
                sume=i;
        }
        if(sumj==1&&n==1)
        {
            cout<<"-1"<<endl;
            continue;
        }
        if(sume)
        {
            cout<<"1"<<endl;
            cout<<sume<<endl;
            continue;
        }
        int e=2;
        cout<<"2"<<endl;
        for(i=1;i<=n;i++)
        {

            if(!e)
                break;
            if(a[i]&1)
            {
                cout<<i<<' ';
                e--;
            }

        }
        cout<<endl;
    }
    return 0;
}

B.Count Subrectangles

题目描述
题意:有两个数组a和b只有0和1,一个表示列,一个表示行,组成一个矩阵,对应位置是它俩的乘积。
求面积为k的全为1的矩阵有多少个。
要求出由a和b的矩阵是不现实的。
求前缀和:如果要形成一个矩形(x∗y)=k,那么要保证有在 a 数组中要有 x 个连续的1,在 b 数组中要有 y 个连续的1
OCDE:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        int i,n;
        cin>>n;
        int a[110];
        int sumj=0,sume=0;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
            if(a[i]&1)
                sumj++;
            else if(!sume)
                sume=i;
        }
        if(sumj==1&&n==1)
        {
            cout<<"-1"<<endl;
            continue;
        }
        if(sume)
        {
            cout<<"1"<<endl;
            cout<<sume<<endl;
            continue;
        }
        int e=2;
        cout<<"2"<<endl;
        for(i=1;i<=n;i++)
        {

            if(!e)
                break;
            if(a[i]&1)
            {
                cout<<i<<' ';
                e--;
            }

        }
        cout<<endl;
    }
    return 0;
}

C. Unusual Competitions

题目描述
题意:括号匹配。交换括号使得括号合法。可以进行任意次选择连续的k个字符,对他们随意排序需要花费k个精力。要使得括号匹配需要消耗最少多少体力。
左右括号数量不相等不可能匹配,输出-1.
若(加1;若)减1.
若val等于-1,说明)没有匹配,需要修改,记录这个)。
若val等于0,说明这(与前面记录的)之间的括号可以匹配。
CODE:

#include <iostream>
#include <cstring>
using namespace std;
    char a[1000005];
int main()
{
    int n,i,j;
    int suml,sumr;
    suml=sumr=0;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]=='(')
            suml++;
        else if(a[i]==')')
            sumr++;
    }
    if(sumr!=suml)
    {
        cout<<"-1"<<endl;
        return 0;
    }
    int ans,pos,val;
    ans=pos=val=0;
    for(j=1;j<=n;j++)
    {
        if(a[j]=='(')
        {
            val++;
            if(val==0)
                ans+=j-pos+1;
        }
        else{
            val--;
            if(val==-1)
                pos=j;
        }
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44350170/article/details/104783403