Codeforces Round #691 (Div. 2) A-C题解

(感觉这场有点毒呀,是我太菜了)

A. Red-Blue Shuffle

题目传送门:

A. Red-Blue Shuffle

题意:

给你n张牌,每张牌上有一个红色的数字和一个蓝色的数字,你可以将牌随便排序,问你是红色组成的数字大于蓝色的概率大,还是蓝色组成的数字大于红色的概率大,还是两者相等。

思路:

题目也没要求具体的概率。那么显然牌上红色数字大于蓝色的数字的牌的数量比较多的话,那么就是红色赢。同理也可判断出蓝色赢或者两者平局。

AC Code

#include<bits/stdc++.h>
using namespace std;
int a[1005],b[1005];
int main()
{
    
    
    int t;
    scanf("%d",&t);
    while(t--)
    {
    
    
        int n;
        scanf("%d",&n);
        int num1=0,num2=0;
        for(int i=1;i<=n;i++)
            scanf("%1d",&a[i]);
        for(int i=1;i<=n;i++)
            scanf("%1d",&b[i]);
        for(int i=1;i<=n;i++)
        {
    
    
            if(a[i]>b[i]) num1++;
            else if(b[i]>a[i]) num2++;
        }
        if(num1>num2) printf("RED\n");
        else if(num1==num2) printf("EQUAL\n");
        else printf("BLUE\n");
    }
    //system("pause");
    return 0;
}

B. Move and Turn

题目传送门:

B. Move and Turn

题目大意:

有一个无限展的二维平面,一个机器人每秒可以前进一个单位,但是每一秒之后,机器人必须向左转或者向右转。问你n秒之后机器人可能出现的坐标的数量。

思路:

一看感觉应该是有规律。于是先敲了一个dfs的代码,暴力跑了前面10几个数据。

n=1 —— res=4
n=2 —— res=4
n=3 —— res=12
n=4 —— res=9
n=5 —— res=24
n=6 —— res=16
n=7 —— res=40
n=8 —— res=25
n=9 —— res=60
那么到这里规律应该就很明显了。把奇数和偶数分开来看,第k个偶数的答案就是(k+1)^2,第k个奇数的答案就是( 1 + k ) * k / 2 * 4

AC Code

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int n;
    scanf("%d",&n);
    int a=4,b=4;
    if(n%2==1)
    {
    
    
        int k=(n+1)/2;
        int ans=(1+k)*k/2;
        printf("%d\n",4*ans);
    }
    else
    {
    
    
        int k=n/2;
        printf("%d\n",(k+1)*(k+1));   
    }
    //system("pause");
    return 0;
}

C. Row GCD

题目传送门:

C. Row GCD

题目大意:

在这里插入图片描述

思路:

(不要问我以下是怎么证出来的,因为我也不会,如果有看到的小伙伴知道的话请教教我)

1、gcd(a1,a2,a3,a4……)=gcd(a1,gcd(a2,a3,a4……))

2、gcd(a1,a2) = gcd(a1 , a2-a1)

然后就可以推导题目所求
gcd(a1+d , a2+d , a3+d , a4+d)=gcd(a1+d , a2 - a1 , a3 - a2 , a4 - a3 ) = gcd(a1+d , gcd ( a2 - a1 , a3 - a2 , a4 - a3 ) )

AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
LL a[N],b[N];
LL gcd(LL a,LL b)
{
    
    
    if(b==0) return a;
    else return gcd(b,a%b);
}
int main()
{
    
    
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    for(int i=1;i<=m;i++)
        scanf("%lld",&b[i]);
    if(n==1)
    {
    
    
        for(int i=1;i<=m;i++)
            printf("%lld ",a[1]+b[i]);
        return 0;
    }
    sort(a+1,a+1+n);
    LL ans=a[2]-a[1];
    for(int i=2;i<=n;i++)
        ans=gcd(ans,a[i]-a[i-1]);
    for(int i=1;i<=m;i++)
        printf("%lld ",gcd(ans,a[1]+b[i]));
    printf("\n");
    //system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Stevenwuxu/article/details/111411262