codeforces hello 2019 A,B,C 题解

A. Gennady and a Card Game

题目:

传送门A

题意:

给出一个2位字符串,看看后面5个是否有一个与其至少一个字符相同。

代码如下:

#include <bits/stdc++.h>
using namespace std;
string b[8];
int main()
{
    for (int i=0;i<6;i++)
        cin>>b[i];
    int flag=0;
    for (int i=1;i<=5;i++)
    {
        for (int j=0;j<2;j++)
            if(b[i][j]==b[0][j])
        {
            flag=1;
            break;
        }
    }
    if(flag)
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }

    return 0;
}

B. Petr and a Combination Lock 

题目:

传送门B

题意:

给出一组角度,求经过操作后是否可以回到原来位置,可以顺时针转也可以逆时针转。

思路:

因为只有两种情况,可以直接dfs搜索即可。

代码如下:


 

#include <bits/stdc++.h>
using namespace std;
int n,flag=0;
int a[20];
void dfs (int loc,int edg)
{
    if(loc==n)
    {
        if((edg+360)%360==0)
            flag=1;
        return;
    }
    dfs(loc+1,edg-a[loc]);
    dfs(loc+1,edg+a[loc]);
}
int main()
{
    scanf("%d",&n);
    for (int i=0;i<n;i++)
        scanf("%d",&a[i]);
    dfs(0,0);
    if(flag)
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }
    return 0;
}

 C. Yuhao and a Parenthesis

题目:

传送门C

题意:

给出一些字符串,问两个一组,最多可以 拼成多少组可以化为空串的字符串。

思路:

记录下每个字符串净剩下的字符个数,只有字符串只有一种字符的才能被记录下来,然后找两种字符数目相同的其中的最小值,累加即可。

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn=5*1e5+5;
int n;
int num1[maxn],num2[maxn];
int main()
{
    memset (num1,0,sizeof(num1));
    memset (num2,0,sizeof(num2));
    scanf("%d",&n);
    if(n==1)
    {
        printf("0\n");
        return 0;
    }
    for (int i=0;i<n;i++)
    {
        int numa=0,numb=0;
        char str[maxn];
        scanf("%s",str);
        int len=strlen(str);
        char S[maxn];
        int loc=0;
        for (int j=0;j<len;j++)
        {
            if(loc==0)
            {
                S[loc++]=str[j];
                if(str[j]==')')
                    numa++;
            }
            else
            {
                if(S[loc-1]=='('&&str[j]==')')
                    loc--;
                else
                {
                    if(str[j]==')')
                        numa++;
                    S[loc++]=str[j];
                }
            }
            if(S[loc-1]==')'&&numb)
                break;
        }
        numb=loc-numa;
        if(numa==0&&numb==0)
        {
            num1[0]++;
        }
        else if(numa==0&&numb)
        {
            num2[numb]++;
        }
        else if(numa&&numb==0)
        {
            num1[numa]++;
        }
    }
    int ans=num1[0]/2;
    for (int i=1;i<=maxn;i++)
        ans+=min(num1[i],num2[i]);
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/85889074