Codeforces Round #651 (Div. 2) (A思維,B 思維,C 博弈,D二分,E 思維)

題目鏈接

A. Maximum GCD

題意:給你一個n  從1~n中找兩個數 a、b 使得    gcd(a,b)最大

做法:答案:n/2

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=2e3+10;
int a[N],n;
int main()
{
    int _=read();while(_--)
    {
        int n=read();
        printf("%d\n",n/2);
    }
}

B. GCD Compression

題意:t組數據  每組2n(n<=1000)個數a[i],每次從a數組選兩個數求和,加入到b數組中,共(n-1)個數,使得 n-1 個數的  gcd 大於1

做法:選取構造兩數之和爲偶數即可。

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=2e3+10;
int a[N],n;
int main()
{
    int _=read();while(_--)
    {
        queue<int>odd,ev;
        n=read();
        rep(i,1,2*n)
        {
            a[i]=read();
            if(a[i]%2) odd.push(i);
            else ev.push(i);
        }
        vector<pair<int,int> >ans;
        while(ans.size()<n-1){
            //printf("an:%d\n",ans.size());

            if(odd.size()>=2) {
                int x=odd.front();odd.pop();
                int y=odd.front();odd.pop();
                ans.push_back({x,y});
            }
            if(ans.size()==n-1) break;
            if(ev.size()>=2){
                int x=ev.front();ev.pop();
                int y=ev.front();ev.pop();
                ans.push_back({x,y});
            }
        }
        for(auto now:ans) printf("%d %d\n",now.first,now.second);
    }
}

C. Number Game

題意:給你一個數n(<=1e9)  每次兩個操作:

1、選擇一個n的奇數的因子k,並將n代替爲n/k

2、n減1

Ashishgup先手 FastestFinger後手,n爲1的時候無法繼續操作,誰無法操作誰就輸了,輸出贏的人名字

做法:簡單博弈論,根據簡單分析必勝態必敗態:

(1必敗) (2 必勝)(3必勝)(4必敗)(5必勝)(6必敗)

奇數必勝,偶數考慮唯一分解下,當2的次冪等於1 其他質數次冪大於1就是必勝態,比如2*3^2  我可以除3 變成2^3

當2的次冪大於1  其他質數次冪  之和大於0 就是必勝態。

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=2e3+10;
int a[N],n;
int main()
{
    int _=read();while(_--)
    {
        int n=read();
        if(n==1){puts("FastestFinger");continue;}
        if(n==2){puts("Ashishgup");continue;}
        if(n%2){
            puts("Ashishgup");continue;
        }
        int num1=0,num2=0;
        for(int i=2;i*i<=n;++i){
            if(n%i==0){
                int res=0;
                while(n%i==0) n=n/i,res++;
                //printf("i:%d res:%d\n",i,res);
                if(i==2) num1=res;
                if(i%2) num2+=res;
            }
        }
        if(n==2) num1++;
        if(n!=1&&n%2) num2++;

        //printf("num1:%d num2:%d\n",num1,num2);


        if(num1==1){
            if(num2>1) puts("Ashishgup");
            else puts("FastestFinger");
        }
        else{
            if(num2>0) puts("Ashishgup");
            else puts("FastestFinger");
        }

    }
}

 

D. Odd-Even Subsequence

題意:給定n長度的序列a,以及k。要求從s中選取k長度的子序列使得以下這個值最小

做法:參考來自:博客

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=2e5+10;
int a[N],n,k;
int run(int mid)
{
    int num0=k/2,num1=k-k/2;
    int n0=0,n1=0;
    for(int i=1;i<=n;++i){
        if(a[i]<=mid) {
            n1++;
            if(i+1<=n) n0++,i++;
        }
    }
    if(n1>=num1&&n0>=num0) return 1;
    n1=n0=0;
    n1=1;
    for(int i=2;i<=n;++i){
        if(a[i]<=mid) {
            n0++;
            if(i+1<=n) n1++,i++;
        }
    }
    if(n1>=num1&&n0>=num0) return 1;
    return 0;


}
int main()
{
    n=read(),k=read();
    rep(i,1,n) a[i]=read();
    int mi=a[1],mx=a[1];
    rep(i,2,n) mi=min(mi,a[i]),mx=max(mx,a[i]);

    int l=mi,r=mx,ans;
    while(l<=r){
        int mid=l+r>>1;
        if(run(mid)) ans=mid,r=mid-1;
        else l=mid+1;
    }
    printf("%d\n",ans);
}

E. Binary Subsequence Rotation

題意和做法參考來自:博客

 

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N = 1000100;
char str1[N], str2[N];

int main()
{
    int n, i, j, k, sum1, sum2, num1, num2;

    sum1 = sum2 = 0;
    scanf("%d %s %s", &n, str1, str2);
    for(i=0;i<n;i++)sum1 += str1[i]-'0';

    for(i=0;i<n;i++)sum2 += str2[i]-'0';
    if(sum1 != sum2)printf("-1\n");
    else{
        num1 = num2 = 0;
        for(i=0;i<n;i++)
            if(str1[i] != str2[i]){
                if(str1[i] == '0'){
                    if(num1 != 0)num1--;
                    num2++;
                }else{
                    if(num2 != 0)num2--;
                    num1++;
                }
            }
        printf("%d\n", num1+num2);
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章