Codeforces Round #691(A->C)(C数学)

A:http://codeforces.com/contest/1459/problem/A

题意:

有n张牌,每张上面有两个数字,排列这些牌之后比较上面n个数字的大小放在一起和下面n个数字放在一起的大小,如果上面大的数量多,RED获胜,如果相同则EQUAL 否则BLUE获胜

解析:

明确一点,不管怎么排,一张卡片的上下是不会变的。那么对于全排列,那么每一张都有机会放在第一个位置,那么直接看每张卡片上面比下面大的多还是下面比上面大的多即可。

 

#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstdio>
#include<cmath>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+10;
const int inf=99999999;
char a[maxn],b[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        string a,b;
        cin>>a>>b;
        int s1=0,s2=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]>b[i])
                s1++;
            else if(a[i]<b[i])
                s2++;
        }
        if(s1==s2)
            cout<<"EQUAL"<<endl;
        else if(s1>s2)
            cout<<"RED"<<endl;
        else
            cout<<"BLUE"<<endl;
    }
}

 

B:http://codeforces.com/contest/1459/problem/B

题意:

机器人从原点开始走,第一步可以四面八方任意一个方向,下一次的走向就是上一次的走向的垂直方向。

求n步可能到达的所有位置数。

解析:

一看就知道是规律题了,dfs跑前几个。发现

1  4

2  4

3  12

4  9

5  24

6  16

7  40

8  25

发现,奇数位与上一个奇数位有关,每次差值+4,基础差值从n=4开始为12

偶数位与上一个偶数位有关,每次差值+2,基础差值从n=4开始为5

#include<iostream>
#include<cstring>
#include<map>
#include<queue>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstdio>
#include<cmath>
#include<string.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int maxn=1e3+10;
const int inf=99999999;
int num[maxn];
int main()
{
    num[1]=4;
    num[2]=4;
    num[3]=12;
    int cnt1=5,cnt2=12;
    for(int i=4;i<=1000;i++)
    {
        if(i%2)
        {
            num[i]=num[i-2]+cnt2;
            cnt2+=4;
        }
        else
        {
            num[i]=num[i-2]+cnt1;
            cnt1+=2;
        }
    }
    int n;
    cin>>n;
    cout<<num[n]<<endl;
}

C:http://codeforces.com/contest/1459/problem/C

解析:

gcd(a,b)=gcd(a,b-a)

gcd(a,b)=gcd(a-b,b)

gcd(a,b,c....z)=gcd(a,gcd(b,c,....z))

那么:gcd(a1+b1,a2+b1,a3+b1......an+b1)

从a2开始,每一项减前一项有:

gcd(a1+bi , a2-a1,a3-a2......an-an-1)

那么预处理出gcd(a2-a1....an-an-1)==sum,然后跑b[]直接gcd(a1+bi,sum)即可。

#include<iostream>
#include<cstring>
#include<map>
#include<queue>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstdio>
#include<cmath>
#include<string.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int maxn=2e5+10;
const int inf=99999999;
ll n,m;
ll a[maxn],b[maxn];
bool cmp(ll a,ll b)
{
    return a>b;
}
ll gcd(ll a,ll b)
{
     return b==0?a:gcd(b,a%b);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)    
        cin>>b[i];
    sort(a+1,a+1+n,cmp);
    ll sum =a[2]-a[3]; 
    for(int i=3;i<n;i++)
    {
        sum=gcd(sum,a[i]-a[i+1]);
    }
    for(int i=1;i<=m;i++)
    {
        ll md = gcd(a[1]+b[i],sum);
        cout<<md<<" ";
    }
    cout<<endl;
}

 

posted @ 2020-12-20 15:44  liyexin  阅读(155)  评论(1编辑  收藏  举报