BNUZ训练2021-09-24

A - Domino Disaster

题目大意

  存在一个 2 ∗ n 2*n 2n 的一个网格图,我们有多个 2 ∗ 1 2*1 21 的方块,保证每一个方格都能被覆盖。方块有 4 4 4 种摆放方式。遮住一排,要找出被遮住的字母是什么。
在这里插入图片描述

题解

  当方块水平放置的时候我们直接照着输出就行了,当没被遮住的是U的话,被遮住的肯定是D,反之露出D输出U。

#include <stdio.h>
#include <string>
using namespace std;
int main(){
	int t;scanf("%d",&t);
	while(t--){
		int n;scanf("%d",&n);
		char str[100100];
		getchar();
		gets(str);
		for(int i=0;i<n;i++){
			if(str[i]=='D'){
				printf("U");
			}else if(str[i]=='U'){
				printf("D");
			}else{
				printf("%c",str[i]);
			}
		}
		printf("\n");
	}
	return 0;
}

B - MEXor Mixup

题目大意

  存在一个数组,所有元素的MEX值等于 a a a,所有元素的XOR值等于 b b b,要求找出这个数组的最小长度 l l l

题解

  ① l l l 一定大于 a a a
  因为若 l l l 小于 a a a,那么 a a a 就不是不属于该数组的最小非负整数了。

  ②若x前所有的非负整数元素异或为y,那么刚好x就是最小长度 l l l [ 0 , x ) [0,x) [0,x)

  ③若x前所有的非负整数元素异或为x xor y,那么刚好需要x,这时候可以找两个大于x的数来进行替代。

  ④其余的情况只需要直接加入y就行了。

#include<bits/stdc++.h> 
using namespace std;
int a[300100]={0};
int main(){
	int t;cin>>t;
	for(int i=1;i<300100;i++)
		a[i]=a[i-1]^i;
	while(t--){
		int x,y;cin>>x>>y;
		if(a[x-1]==y)cout<<x<<endl;
		else if(a[x-1]==(x^y))cout<<x+2<<endl;
		else cout<<x+1<<endl;
	}
	return 0;
}

C - Carrying Conundrum

题目大意

  定义一种新的加法,隔位进位。给出一个结果数字 n n n,要求找到有多少种 a a a b b b,使得在这种新的加法下 a + b = n a+b=n a+b=n

题解

  由于是隔行进位,所以 n n n 的奇数和偶数位是可以分开运算,最后在进行一个乘法就行了。
也就是说,将奇数位的数字单独组成一个数字,将偶数位的数字单独组成一个数字。我们只需要分别找出奇数位组成的数字和偶数位组成的数字分别有几种组成方法,我们假设它们分别为 n 1 n1 n1 n 2 n2 n2,那么答案就是 n 1 ∗ n 2 − 2 n1*n2-2 n1n22,因为当奇数全取0和当偶数全取0的时候是不行的。(正整数)
(这道题是我最后几秒钟写出来的,因为按照我的想法中间加了好多判断条件,最后赌一把删掉反而过了)

#include <bits/stdc++.h>
using namespace std;
int main(){
	int t;cin>>t;
	while (t--){
		string str;cin>>str;
		stack<char> a, b;
		for(int i=0;i<str.size();i++){
			if(i%2==1)a.push(str[i]);
			else b.push(str[i]);
		}
		int n1=0,n2=0,flag=1;
		
		while(!a.empty()){
			n1+=(a.top()-'0')*flag;
			flag*=10;
			a.pop();
		}n1++;
		
		flag=1;
		while(!b.empty()){
			n2+=(b.top()-'0')*flag;
			flag*=10;
			b.pop();
		}n2++;
		cout<<n1*n2-2<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值