Codeforces Round #651 (Div. 2) A~D题解

比赛链接:Codeforces Round #651 (Div. 2)

目录

比赛链接:Codeforces Round #651 (Div. 2)

A. Maximum GCD

B. GCD Compression

C. Number Game

D. Odd-Even Subsequence


A. Maximum GCD

题意:给定一个N,问1~N中若选出一对数,使得这对数的GCD最大,GCD是多少。

思路:GCD(N - (N&1),N/2)必定最大。

AC代码:

/*---------------------------------
 *File name: A.cpp
 *Creation date: 2020-06-20 22:22
 *Link: 
 *-------------------------------*/
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define pb push_back
#define LL long long
#define PII pair<int, int>
#define Pque priority_queue 
using namespace std;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const double EPS = 1e-8;

int main(){
	int t;
	scanf("%d", &t);
	while(t--){
		int n;
		scanf("%d", &n);
		printf("%d\n", n / 2);
	}
	return 0;
}

B. GCD Compression

题意:给定一个长度为2 * N的数组A,问能否选出一个长度为2N-2的子序列使得子序列的GCD>1。

思路:偶数+偶数= 偶数, 奇数+ 奇数= 偶数,所以只需要选出N-1对奇偶性相同的数就可以。

AC代码:

/*---------------------------------
 *File name: B.cpp
 *Creation date: 2020-06-20 22:57
 *Link: 
 *-------------------------------*/
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define pb push_back
#define LL long long
#define PII pair<int, int>
#define Pque priority_queue 
using namespace std;
const double EPS = 1e-8;
const int MaxN = 1e4 + 10;
const int maxn = 5e5 + 5;
const long long Inf = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
const long long mod = 998244353;

int t , n  , m , x ;

int main(){
	scanf("%d", &t);
	while(t--){
		scanf("%d",&n);
		vector<int> odd , even ;
		for(int i = 1 ; i <= 2 * n ; ++i){
			scanf("%d",&x);
			if(x & 1) odd.pb(i);
			else even.push_back(i);
		}
		int o, k, e;
		o = k = e = 0;
		int p = n - 1;
		int Sizee = even.size();
		int Sizeo = odd.size();
		while(k < p){
			++k ; 
			if(e + 1 < Sizee){
				printf("%d %d\n",even[e],even[e + 1]);
				e += 2;
			}
			else if(o + 1 < Sizeo){
				printf("%d %d\n",odd[o],odd[o + 1]);
				o += 2;
			}
		}
	}
	return 0;
}

C. Number Game

题意:给定一个N,两人轮流对N操作,每次可以有两种选择:第一种是当N > 1时,将N -= 1,第二种是将N /= Fac, Fac为N的不为1的奇因子,两人谁先把N置为1谁获胜。

思路:如果N是奇数,N/N=1,先手获胜,排除N=1的情况;如果N是2,先手获胜。除去这两种情况后,当N是偶数时,将N质因子分解,如果只有2是因子,则后手获胜,因为只能进行第二种操作。如果不止2为因子,则可以直接将所有非2因子除去,只剩下2因子或一个2因子都不剩,再判断就可以了。

AC代码:

/*---------------------------------
 *File name: A.cpp
 *Creation date: 2020-06-20 23:38
 *Link: 
 *-------------------------------*/
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define pb push_back
#define LL long long
#define PII pair<int, int>
#define Pque priority_queue 
using namespace std;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const double EPS = 1e-8;

int n , k , t; 
vector<int> p(33, 0);

int main(){
	p[0] = 1;
	for(int i = 1 ; i <= 30 ; ++i) p[i] = 2 * p[i - 1];
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		if(n == 1) puts("FastestFinger");
		else if(n & 1)puts("Ashishgup");
		else if(n == 2) printf("Ashishgup\n");
		else{
			bool flag = false;
			int cnt = 0 ;
			int N = n;
			while(n % 2 == 0){
				cnt++; 
				n /= 2;
			}
			int tot = 0 ;
			for(int i = 2 ; i * i <= n ; ++i){
				if(n % i) continue;
				while(n % i == 0){
					n /= i ;
					tot++;
				}
			}
			if(n != 1) tot++;
			if(p[cnt] == N) flag = true;
			if(flag) printf("FastestFinger\n");
			else{
				if((tot > 1 && p[cnt] == 2) ||(p[cnt] != 2))printf("Ashishgup\n");
				else cout << "FastestFinger" << endl;
			}
		}
	}
	return 0;
}

D. Odd-Even Subsequence

题意:给定一个长度为N的数组A以及一个K,问能否选出一个长度为K的子序列,使得子序列的下面这个式子的值Min(Max(s1,s3,s5,....), Max(s2,s4,s6...))尽量小。

思路:傻逼二分题,直接二分答案,分两次On分别判断能不能在偶数位置或者奇数位置上选出的数都<=x。

AC代码:

/*---------------------------------
 *File name: D.cpp
 *Creation date: 2020-06-21 12:11
 *Link: 
 *-------------------------------*/
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define pb push_back
#define LL long long
#define PII pair<int, int>
#define Pque priority_queue 
using namespace std;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const double EPS = 1e-8;

vector<int> a;

bool check(int x, bool flag, int k){
	for(int i = 0; i < a.size(); ++i){
		if(k != 0){
			if(flag) k--, flag ^= 1;
			else{
				if(a[i] <= x) k--, flag ^= 1;
			}
		}
		else break;
	}
	return k == 0;
}

int main(){
	int n, k;
	scanf("%d %d", &n, &k);
	a.resize(n);
	for(int i = 0; i < n; ++i){
		scanf("%d", &a[i]);
	}
	int l = 1, r = inf;
	int ans;
	while(l <= r){
		int mid = l + r >> 1;
		if(check(mid, 0, k) || check(mid, 1, k)){
			r = mid - 1;
			ans = mid;
		}
		else l = mid + 1;
	}
	printf("%d\n", ans);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值