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

         题意:根据第一段,只是让你找到任意一组元素,和为偶数即可。还可以根据OUTPUT最后一句,多种答案,输出任意一种。  

           解析:随便找嘛,所以如果碰到单个偶数,直接输出,否则找出任意两个奇数输出即可。都没有,就输出-1.

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=105;
    int a[maxn];
    int id[maxn];
    int main()
    {
    
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            cin>>n;
            int ok=0,end;
            for(int i=1;i<=n;i++)
            {
                cin>>a[i];
                if(a[i]%2==0)
                {
                    end=i;
                    ok=1;
                }
            }
            if(ok)
            {
                cout<<"1"<<endl;
                cout<<end<<endl;
            }
            else
            {
                int ok2=0,l,r;
                for(int i=1;i<=n;i++)
                {
                    if(a[i]%2!=0)
                    {
                        l=i;
                        for(int j=i+1;j<=n;j++)
                        {
                            if(a[j]%2!=0)
                            {
                                r=j;
                                ok2=1;break;
                            }
                        }
                    }
                    if(ok2)
                        break;
                }
                if(ok2)
                {
                    cout<<'2'<<endl;
                    cout<<l<<" "<<r<<endl;
                }
                else
                    cout<<"-1"<<endl;
            }
        }
    }

        题意:给出n,m,k。出来一个n*m的只含0或1的矩阵,找出有几个面积为k的块。

        解析:1可以重复用,根据样例1,比如 1  1  1,面积为2有两个,中间的1被用了2次。

           看数据,不能再开二维数组一个一个暴力了。思考一下,面积为k,我们可以把它分一下,x*y==k,只要看竖着有几个连续1构成的x,横着有几个连续1构成的y,x*y累加起来即为答案。

        开一个c[],用来记录k的因数(注意i*i==k时,只放进去一个i)。记录连续1的代码:

            for(int j=0;j<n;j++)
            {
                if(a[j]==1)
                    mid++;
                else
                    {
                        mid=0;
                    }
                if(mid==c[i])
                {
                    x++;mid--;  //mid--保证了重复1的使用,
                }
            }

         假如k=6,我们不仅要统计2(横)*3(竖),还要统计3(竖)*2(横),这也是为什么c[]放进 i 的同时要放进k/i。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+10;
    typedef long long ll;
    int a[maxn],b[maxn],c[maxn];
    int main()
    {
        int n,m,k;
        cin>>n>>m>>k;
        for(int i=0;i<n;i++)
            cin>>a[i];
        for(int i=0;i<m;i++)
            cin>>b[i];
        int tot=0;
        for(int i=1;i*i<=k;i++)
        {
            if(k%i==0)
            {
                if(i*i==k)
                    c[tot++]=i;
                else
                    {
                        c[tot++]=i;
                        c[tot++]=k/i;
                    }
            }
        }
        ll sum=0;        
        for(int i=0;i<tot;i++)
        {
    
            int x=0,y=0;
            int mid=0;
            for(int j=0;j<n;j++)
            {
                if(a[j]==1)
                    mid++;
                else
                    {
                        mid=0;
                    }
                if(mid==c[i])
                {
                    x++;mid--;
                }
            }
            mid=0;
            for(int j=0;j<m;j++)
            {
                if(b[j]==1)
                    mid++;
                else
                    mid=0;
                if(mid==k/c[i])
                {
                    y++;mid--;
                }
            }
            sum+=x*y;
        }
        cout<<sum<<endl;
    }

        题意:问给出的只含()的字符串能否变成可以进行运算的串,如果不能,可以进行这样的操作:L-R内进行重新排列,操作数就是区间长度,求最小操作数。如果最终还是达不到目的,输出-1

        解析:所谓可以进行运算的串,实际上就是一个标准的(数量=)数量而已,因为它是随便排,所以说只要 ( 的数量== ) 的数量,我们一定可以把它排成标准的串。所以提前看一下它们的各自数量,只要不相同,那肯定不行,输出-1。用 L 来记录 ) 的数量,ans表示可抵消 ) 的 ( 数量。遇见 ) ,L++,遇见 ( ,如果L那边有存量,那么我们的 ( 可以抵消 ) 一次,ans++。这样下去,结果就是ans*2。这里很巧妙,是一个标准匹配,只要可以弄出来一个(),马上就ans++,这个ans,恰好就是所操作的区间长度的一半,因为不停的在抵消前面的),其实自己模拟一下,就会很明白了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=1e6;
    int a[maxn];
    int id[maxn];
    int main()
    {
        string s;
        int n;
        cin>>n;
        cin>>s;
        int ans=0,l=0;
        int len=s.length();
        int cnt1=0,cnt2=0;
        for(int i=0;i<len;i++)
        {
            if(s[i]==')')
                cnt2++;
            else
                cnt1++;
        }
        if(cnt2!=cnt1)
        {
            cout<<"-1"<<endl;
            return 0;
        }
        for(int i=0;i<len;i++)
        {
            if(s[i]==')')
                l++;
            else
                {    l--;            
                    if(l>=0)
                        ans++;    
                }
        }
            cout<<ans*2<<endl;
        return 0;
    }
  • 相关阅读:
    FDR校正
    PHP base64 编码转化图片并进行指定路径的保存和上传处理(转自https://cloud.tencent.com/developer/article/1333877)
    google网页评测工具
    链接类型:预加载
    鼠标经过时显示、隐藏提示
    thinkphp5导入excel数据
    JS消息窗口滚动到底部
    datatable分页使用箭头
    Mysql基础
    php-MD5/sha1
  • 原文地址:https://www.cnblogs.com/liyexin/p/12445983.html
Copyright © 2011-2022 走看看