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;
}

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/106891078