Codeforces Round #682 (Div. 2)题解(ABCD暂时)

A. Specific Tastes of Andre

题意:
定义good数组:一个数组的所有值的和可以整除这个数组的大小,则称这个数组为good数组。
定义perfect数组:一个数组的所有子数组都是good数组,则称这个数组是perfect数组。
题目有 t 组数据,每组给出一个 n,要求构造并输出一个大小是 n 的perfect数组。
(数组中的数的大小要在1~100之间)

题解:
很显然,输出n个相同大小的数字即可。
我选择输出n个1。

AC代码:

#include
using namespace std;
int t;
int n;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			printf("1 ");
		}
		printf("\n");
	}
	return 0;
}

B. Valerii Against Everyone

题意:
t组数据,每组给个n,然后n个数字。n个数字范围在1e9内。
每个数字x代表了2的x次方。
要求求两个不相交的区间使得这两个区间内的数字代表数字的和相等,存在这样的一对区间就输出YES,否则输出NO。

题解:
我们知道两个2的x次方等价于一个2的x+1次方,因此两个区间内的数字如果不一样的话就必须要用这种方法凑,但是只要数组中出现两个一样的数字我们就可以只把这两个数字选出来。
因此,只要给的数组中有两个一样的数字就输出YES,否则就输出NO。
很难说清楚,仔细想想。

AC代码:

#include
using namespace std;
int t;
int n;
map<int,int> mp;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		mp.clear();
		int flag=0; 
		for(int i=1;i<=n;i++)
		{
			int a;
			scanf("%d",&a);
			if(mp[a]) flag=1;
			mp[a]=1;
		 } 
		if(flag) puts("YES");
		else puts("NO");
	}
	return 0;
}

C. Engineer Artem

题意:
给一个n*m的矩阵A,要求输出一个n行m列的矩阵B,要求B中每一个元素要么和A中对应元素相等,要么比A中对应元素大1。并且B矩阵中不存在两个相邻元素相等。

题解:
对A中的每一个元素+1可以改变其奇偶性,保持不变就是不变其奇偶性,所以对于每一个A中元素我们可以决定其奇偶性。
那么我们只要构建出一个相邻元素奇偶性不同的矩阵即可,因为奇偶性不同也就不可能相等。
因此我的构造方式是让B中的元素的奇偶性和其对应的坐标的 i+j 的奇偶性相同。

AC代码:

#include
using namespace std;
int t;
int n,m;
int arr[105][105];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				scanf("%d",&arr[i][j]);
			}
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if((i+j)%2!=arr[i][j]%2)
				{
					arr[i][j]++;
				}
				printf("%d ",arr[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}

D. Powerful Ksenia

题意:
给出n个数字,每次可以选三个不同的数字,然后将它们变成它们三个数字的异或和。问能不能最多n次操作的限制内使得这n个数字相等。如果可以要求输出方案。

题解:
我们考虑三个数字中有两个相等的情况,即a a b,异或和为b,即我们可以将它们全部变成b。因此我们可以考虑先将数列变成一个两两相等的数字的数列,然后再用上面说的方法来把它们都变成一个相同的数字。
我们可以发现奇数一定可以构造出来,因为可以变成很多个两个相等的数字和一个多余的数字。
那么偶数的情况呢?很显然每次操作不会改变整个数列的异或和,而偶数个数字最终如果相等,异或和一定为0,那么如果n为偶数且异或和不为0就一定无解。
如果n为偶数且异或和为0,那么我们可以只对前n-1个数字做奇数的那种操作,最终变成的数字一定和最后一个数字相等。

AC代码:

#include
using namespace std;
int n;
const int maxn=1e5+50;
int arr[maxn];
void print(int n)
{
	for(int i=1;i<=n-2;i+=2)
	{
		printf("%d %d %d\n",i,i+1,i+2);
	}
	for(int i=1;i<=n-2;i+=2)
	{
		printf("%d %d %d\n",i,i+1,n);
	}
	return;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&arr[i]); 
	}
	if(n%2)
	{
		printf("YES\n");
		printf("%d\n",n-1);
		print(n);
	}
	else
	{
		int ans=0;
		for(int i=1;i<=n;i++) ans=ans^arr[i];
		if(ans!=0) printf("NO\n");
		else
		{
			printf("YES\n");
		    printf("%d\n",n-2);
		    print(n-1);
		}
	 } 
	return 0;
}

E. Yurii Can Do Everything

待补。

F. Olha and Igor

待补。

你可能感兴趣的:(刷题记录,题解)