A - Domino Disaster
题目大意
存在一个
2
∗
n
2*n
2∗n 的一个网格图,我们有多个
2
∗
1
2*1
2∗1 的方块,保证每一个方格都能被覆盖。方块有
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
n1∗n2−2,因为当奇数全取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;
}