【比赛记录】10.18 Codeforces Round #676 (Div. 2)
A
题目大意:给定\(a,b,\)求\(\min\left\{(x⊕a)+(x⊕b)\right\}\)
\(⊕\)是异或。
\(\text{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,\)四联通,只能走数字一样的地方,问能不能改变最多两个格子使得从起点无法到达终点。
\(\text{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\n",ans);
if(ans==0)continue;
if(ans==c1){
if(a[1][2]==1)cout<<"1 2\n";
if(a[2][1]==1)cout<<"2 1\n";
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\n";
if(a[2][1]==0)cout<<"2 1\n";
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
题目大意:给定一字符串,有两种操作,选择\(i\in (1,n),s\to s_is_{i-1}...s_2+s\)或\(s\to s+s_{n-1}s_{n-2}...s_i\)使得\(s\)变为一个回文串。
\(\text{solution:}\)
考虑成套方法:
-
进行\(\text{L 2}\)使得字符串变为\(s.s.....\)
-
进行\(\text{R 3}\)使得字符串变为\(s.s..........s\)
-
进行\(\text{R 2}\)使得字符串变为\(s.s..........s..........s.\)
-
进行\(\text{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;
}