Codeforces Round #648 (Div. 2)题解(A,B,C,D)

Codeforces Round #648 (Div. 2)题解(A,B,C,D)

A题:
题意:给你一个矩阵,两个人轮流进行游戏,每个人的回合都要选择一个位置(i,j),把它置为1,前提是第i行和第j列都没有1.
思路:求出行和列中最小的闲置数,其就为游戏进行的次数。偶数为第二个人赢,否则为第一人赢。

#include
#include
#include
#include
#include
typedef long long ll;
using namespace std;
 
bool v1[55],v2[55];//v1为行,v2为列
int arr[55][55];
int n,m;
 
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		cin >> n >> m;
		memset(v1,0,sizeof(v1));
		memset(v2,0,sizeof(v2));
		int c1=n,c2=m;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				scanf("%d",&arr[i][j]);
				if(arr[i][j])
				{
					if(!v1[i]) {v1[i]=1;c1--;}
					if(!v2[j]) {v2[j]=1;c2--;}
				}
			}
		}
		int ans=min(c1,c2);
		if(ans%2==0)
			printf("Vivek\n");
		else
			printf("Ashish\n");
	}
    return 0;
}

B题:
题意:给你一个序列,序列中每个元素除了本身的值外还有一个值b,当b相等时两个元素不能交换,问你能不能将这个序列排成非严格递增的序列。
思路:只要可以进行交换(即有一个bi与bj不相等),这个序列就可以排序。如果不能排序,但其本身就是非严格递增的序列也可以。
写的有点累赘的部分。

#include
#include
#include
#include
#include
using namespace std;

struct node
{
	int a,b;
}arr[505];
 
int n;
 
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		cin >> n;
		for(int i=0;i

C题:
题意:给你两个序列长度为n(元素的值为1-n),通过移动一个序列(整体移动,列如:a1->a3…an->a2),能使两个序列上ai=bi的最大数量。
思路:直接求每个元素到其对应位置需要左移多少次(当然可以右移,这里以左移为例),然后求移动次数出现最多次的就是最大匹配数了。

#include
#include
#include
#include
#include
#define MAX 200005
using namespace std;

 
int arr[MAX];
int b[MAX];
int num[MAX];
int n;
 
int main()
{
		cin >> n;
		int v;
		for(int i=0;i

D题:
题意:给你一个图,让所有的G走出去,所有的B走不出去,你可以把空地变成墙(包括逃离点)。
思路:直接把B附近四格全部设为墙,如果附近有个G,那说明就不能实现(为什么这样会最优,如果封了其他地点,对G的影响不会更好,只会更糟,不多加证明了)然后从逃离点进行遍历,如果有个G点遍历不到,说明实现不了,否则可以全部逃离。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 200005
#define INF 0x7f7f7f7f
typedef long long ll;
using namespace std;
const double eps=1e-6;
const double pi=acos(-1.0);
const ll mo=998244353; 
 
char mp[55][55];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int n,m;
bool vist[55][55];
 
struct node
{
	int a,b;
}now,net;
bool fun(int x,int y)//判断B点附近的点
{
	if(x+1!=n&&mp[x+1][y]=='.')
		mp[x+1][y]='#';
	else if(x+1!=n&&mp[x+1][y]=='G')
		return false;
	if(x-1>=0&&mp[x-1][y]=='.')
		mp[x-1][y]='#';
	else if(x-1>=0&&mp[x-1][y]=='G')
		return false;
	if(y+1!=m&&mp[x][y+1]=='.')
		mp[x][y+1]='#';
	else if(y+1!=m&&mp[x][y+1]=='G')
		return false;
	if(y-1>=0&&mp[x][y-1]=='.')
		mp[x][y-1]='#';
	else if(y-1>=0&&mp[x][y-1]=='G')
		return false;
 
	return true;
}
bool check(int x,int y)
{
	if(x<0||y<0) return false;
	if(x==n||y==m) return false;
	if(mp[x][y]=='#'||vist[x][y]) return false;
 
	return true;
}
 
bool bfs(int x,int y)
{
	queue q;
 
	now.a=x; now.b=y;
	q.push(now);
 
	while(!q.empty())
	{
		now=q.front();
		q.pop();
 
		for(int i=0;i<4;i++)
		{
			net=now;
			net.a+=dx[i];
			net.b+=dy[i];
			if(check(net.a,net.b))
			{
				vist[net.a][net.b]=1;
				q.push(net);
			}
		}
	}
 
	return true;
}
 
 
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		cin >> n >> m;
		memset(vist,0,sizeof(vist));
		for(int i=0;i

你可能感兴趣的:(acm竞赛)