zoukankan      html  css  js  c++  java
  • Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)

    A. Even Subset Sum Problem

    题意:找和是偶数的子集,没什么好说的,直接上代码。
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n,x;
    int a[110];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            x=0;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                if(a[i]%2==0)
                x=i;
            }
            if(x)
            {
                printf("1
    ");
                printf("%d
    ",x);
            }
            if(!x&&n>=2)
            {
                printf("2
    ");
                printf("1 2
    ");
            }
            if(!x&&n<2)
            {
                printf("-1
    ");
            }
        }
    }
    View Code

    B. Count Subrectangles

    题意:给你一个长度为n的数组a,长度为m的数组b。c数组是二维数组c[i][j]=a[i]*b[j],问面积为k的矩形有几个。

    分析:先把k分解因子并记录,观察样例得若a或b中有连续的1,则连续的1的数量可作为因子。例:a数组有i个1,b数组有k/i个连续的1,形成的矩形面积就是k。

    遍历每个因子,把对应的数量加起来。

    #include <iostream>
    #include <algorithm> 
    using namespace std;
    typedef long long ll;
    const int N = 40005;
    int n,m,k,temp;
    int a[N],b[N],c[N];
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=m;i++) scanf("%d",&b[i]);
        for(int i=1;i*i<=k;i++)
        {
            if(k%i==0){
            c[temp++]=i;
            if(i==k/i) continue;
            c[temp++]=k/i;
            }
        }    
        ll ans=0;
        for(int i=0;i<temp;i++)
        {
            ll x=0,y=0,cnt=0;
            for(int j=1;j<=n;j++)
            {
                if(a[j]==1) cnt++;
                else cnt=0;
                if(cnt==c[i]) cnt--,x++;
            }
            cnt=0;
            for(int j=1;j<=m;j++)
            {
                if(b[j]==1) cnt++;
                else cnt=0;
                if(cnt==k/c[i]) cnt--,y++;
            }
            ans=ans+x*y;
        }
        printf("%lld
    ",ans);
    }
    View Code

    C. Unusual Competitions

    题意:给一个只由‘( ’ ‘)’构成的字符串,需要让 ( 和) 按左右一一对应,若不对应可对于区间 l-r 重新排列使其对应,花费精力r-l,求最少花费多少精力能让字符串正常。也就是求最小的区间调整长度。

    分析:我们先确定 ( ,)的个数,若不相等,直接输出-1. 若相等,如果从左到右(  的数量一直大于 )数量最后肯定会符合条件,因为( ,)数量相等。

    我们分析一下不符合条件的时候  ( )有左右的对应关系  可以 ((()))  ,()()这就需要我们满足区间里‘( ’    先进 ‘)’后进。我们可以设一个变量,进一个 ( 就+1,进一个)就-1。

    当变量<0的时候代表区间不符合条件需要调整。由于此时 新进的 )之前,区间都是符合要求的,所以我们只需要从)往后调整区间就可以。并记录每次需要调整的长度。累加即可。

    #include <iostream>
    #include <algorithm>
    const int N=1e6+10;
    using namespace std;
    char k[N];
    int n,step,ed;
    int su[N];
    int main()
    {
        scanf("%d",&n);
        scanf("%s",k+1);
        for(int j=1;j<=n;j++){
            if(k[j]=='(')
            su[0]++;
            else
            su[1]++;
        }
        if(su[0]!=su[1]){
            printf("-1
    ");
            return 0;
        }
        for(int j=1;j<=n;j++)
        {
            if(k[j]==')')
            step--;
            else
            step++;
            if(step<0){
                int a=-1;
                int b=j;
                while(a<0){
                    b++;
                    if(k[b]==')')
                    a--;
                    else
                    a++;
                }
                ed+=b-j+1;
                j=b,step=0;
            }
        }
        printf("%d
    ",ed);
        return 0;
    }
    View Code
  • 相关阅读:
    consumer详解
    消费幂等
    死信队列
    消息重试
    负载均衡
    存储层
    producer消息
    消息发送与接收
    TCC
    form表单提交前进行加密
  • 原文地址:https://www.cnblogs.com/daoyuan/p/12441914.html
Copyright © 2011-2022 走看看