Codeforces Round #554 (Div. 2)·

A. Neko Finds Grapes

A就是钥匙和锁上的数字的和为奇数就行。
odd+even=odd
odd+odd=even
even+even=even
所以只要保证奇数和偶数加就行,就是用奇数的锁去配对偶数的钥匙,偶数的锁去配对奇数的钥匙

# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const LL MAXN=1e5+10;
LL a[MAXN];
LL b[MAXN];
int main()
{
	LL n,m;
	LL ao=0,ae=0,bo=0,be=0;
	LL sum=0;
	
	scanf("%lld %lld",&n,&m); 
	for(LL i=0;i<n;i++){
		scanf("%lld",&a[i]);
		if(a[i]%2==0){
			ae++;
		}else{
			ao++;
		}
	}
	for(LL i=0;i<m;i++){
		scanf("%lld",&b[i]);
		if(b[i]%2==0){
			be++;
		}else{
			bo++;
		}
	}
	sum=min(ae,bo)+min(ao,be);
	printf("%lld",sum);
	
	return 0;
}

B. Neko Performs Cat Furrier Transform

你需要知道:n^0=n,异或时,相同的那一位为0,不相同的那一位为1
题目要求最后要全部为2^m-1的形式,就是二进制的每一位都为1
以第一个样例
39的二进制是 100111,个人思路是先把前面的非0位异或为0,酱紫就不会受后面影响啦,所以当前的n就是为0的最大位数,当前为5;
39⊕(2^5-1)为 111000 为 56
偶数次操作时+1
111000 --> 111001 57
然后再选择n=3
57⊕(2^3-1)为 111110 为 62
62+1=63 111110–>111111 2^6-1
解释

# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
LL n[40];
LL l[40];
int lenn(LL xx)
{
	int flag=0;
	int len=0;
	while(xx){
		int d=xx%2;
		if(d){
			if(flag) break;
			len++;
		}else{
			flag=1;
			len++;
		}
		xx=xx/2;
	}
	return len;
}
int main()
{
	LL x;
	LL t=1;
	
	scanf("%lld",&x);
	LL xx=x;
	LL ans=0;
	int fflag=1;
	while(xx){
		int d=xx%2;
		if(d==0){
			fflag=0;
		}
		xx=xx/2;
		ans++;
	}
	if(fflag){
		printf("0");
		return 0; 
	}
	ans=pow(2,ans)-1;
	//cout<<ans<<endl;
	for(int i=0;i<=30;i++){
		n[i]=pow(2,i)-1;
	}
	
	LL llen=0;
	while(t<=40){
		if(t%2==0){
			x++;
		}else{
			llen=lenn(x);
			x=x^(n[llen]);
			l[t]=llen;
		}
		if(x==ans){
			printf("%d\n",t); 
			for(int i=1;i<=t;i++){
				if(i%2==0) continue;
				else{
					printf("%d ",l[i]);
				}
			}
			break;
		}
		t++;
	}
	
	
	
	return 0;
 } 

C. Neko does Maths

介个用语言不知道怎么描述,QAQ,所以直接上图吧(我不会说介道题我也没有理解透彻的)

解释

# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
LL gcd(LL a,LL b) {return b?gcd(b,a%b):a;}
LL lcm(LL a,LL b) {return a/gcd(a,b)*b;}
int main()
{
	ios::sync_with_stdio(false);
	LL a,b;
	LL x,k;
	
	//scanf("%lld %lld",&a,&b);
	cin>>a>>b;
	if(a==b){
		cout<<0;
		//printf("0");
		return 0;
	}
	x=abs(a-b);
	
	LL ans=lcm(a,b);
	LL ansk=0;
	
	for(LL i=1;(i*i)<=x;i++){
		if(x%i==0){
			k=i-a%i;
			LL lcmm=lcm(a+k,b+k);
			if(lcmm<ans){
				ans=lcmm;
				ansk=k;
			}
			k=((x/i)-a%(x/i));
			lcmm=lcm(a+k,b+k);
			if(lcmm<ans){
				ans=lcmm;
				ansk=k;
			}
		}
	}
	
	//printf("%lld",ansk);
	cout<<ansk;
	return 0;
}

QAQ,C介道题比赛的时候完全没有介个思路啊。。。还是太菜了。。。有待提高啊。。。

posted @   fengzlj  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示