A
题目大意:给定(a,b,)求(minleft{(x⊕a)+(x⊕b) ight})
(⊕)是异或。
( ext{solution:})
显然答案应该是(a xor b.)令两个括号其中一者为(0)即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T--){
int a,b;
scanf("%d%d",&a,&b);
cout<<min((a^b),(a^b))<<endl;
}
return 0;
}
B
题目大意:起点((1,1))终点((n,n),)矩阵中有(0/1,)四联通,只能走数字一样的地方,问能不能改变最多两个格子使得从起点无法到达终点。
( ext{solution:})
考虑对起点和终点周围的两个格子分类讨论即可。
#include<bits/stdc++.h>
using namespace std;
int T,n,a[501][501];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
char c;
cin>>c;
if(i+j==2||i+j==n+n)continue;
a[i][j]=c-'0';
}
}
int ans=0;
int c1=0,c2=0;
if(a[1][2]==1)c1++;
if(a[2][1]==1)c1++;
if(a[n][n-1]==0)c1++;
if(a[n-1][n]==0)c1++;
if(a[1][2]==0)c2++;
if(a[2][1]==0)c2++;
if(a[n][n-1]==1)c2++;
if(a[n-1][n]==1)c2++;
ans=min(c1,c2);
printf("%d
",ans);
if(ans==0)continue;
if(ans==c1){
if(a[1][2]==1)cout<<"1 2
";
if(a[2][1]==1)cout<<"2 1
";
if(a[n][n-1]==0)cout<<n<<" "<<n-1<<endl;
if(a[n-1][n]==0)cout<<n-1<<" "<<n<<endl;
}
else{
if(a[1][2]==0)cout<<"1 2
";
if(a[2][1]==0)cout<<"2 1
";
if(a[n][n-1]==1)cout<<n<<" "<<n-1<<endl;
if(a[n-1][n]==1)cout<<n-1<<" "<<n<<endl;
}
}
return 0;
}
C
题目大意:给定一字符串,有两种操作,选择(iin (1,n),s o s_is_{i-1}...s_2+s)或(s o s+s_{n-1}s_{n-2}...s_i)使得(s)变为一个回文串。
( ext{solution:})
考虑成套方法:
-
进行( ext{L 2})使得字符串变为(s.s.....)
-
进行( ext{R 3})使得字符串变为(s.s..........s)
-
进行( ext{R 2})使得字符串变为(s.s..........s..........s.)
-
进行( ext{R lastpos-1})使得字符串变为(s.s..........s..........s.s)
容易发现,上述字符串满足题目要求。
#include<bits/stdc++.h>
using namespace std;
char s[100001];
int main(){
scanf("%s",s+1);
puts("4");
int g=strlen(s+1),L=strlen(s+1);
puts("L 2");
g++;
puts("R 3");
g+=(g-3);
g+=(g-2);
puts("R 2");
cout<<"R "<<g-1<<endl;
return 0;
}