【比赛记录】10.18 Codeforces Round #676 (Div. 2)

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;
}
原文地址:https://www.cnblogs.com/h-lka/p/13836857.html