4/26~4/27总结

第一周任务 - Virtual Judge (vjudge.net)

大意是给你方阵和操作次数,注意操作次数一定要使用完,

小方块翻转180度后的位置    :a[i][j] != a[n + 1 - i][n + 1 - j]

只要将方阵先翻转180,再对比2个方阵,记录不同的块数

将块数除以2后就是最少能达到目的的步数,

再对剩下的操作数进行讨论

如果操作数大于m了就直接输出no

如果小于m

如果n是奇数,一定能达到题目要求,因为一直对中心的小方块翻转就行了,不影响对称性

如果n是偶数,那么剩下的操作数一定要是偶数

#include
int a[1005][1005];
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n, m,cnt=0;
		scanf("%d %d", &n,&m);
		for(int i=1;i<=n;i++)
			for (int j = 1; j <= n; j++)
			{
				scanf("%d", &a[i][j]);
			}

		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
			{
				if (a[i][j] != a[n + 1 - i][n + 1 - j])
					cnt++;

			}


		int ans = cnt / 2;
		if (ans > m)
			printf("no\n");
		else {
			if (n % 2 != 0)
				printf("yes\n");
			else {
				if ((m - ans) % 2 == 0)
					printf("yes\n");
				else {
					printf("no\n");
				}


			}

		}

		

	}

	return 0;
}

第一周任务 - Virtual Judge (vjudge.net)

题目大意是通过操作使an是a数列里最大的,bn也是b数列里最大的。

只要保证对于每个a[i],b[i],都有a[i]和b[i]中较小的那个要小于an和bn中较小的那个

并且a[i]和b[i]中较大的那个要小于an和bn中较大的那个


#include
int a[105];
int b[105];
int min(int x, int y)
{
	if (x <= y)return x;
	else return y;
}

int max(int x, int y)
{
	if (x >= y)return x;
	else return y;
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n;
		scanf("%d", &n);
		for (int i = 1; i <= n; i++)
			scanf("%d", &a[i]);

		for (int i = 1; i <= n; i++)
			scanf("%d", &b[i]);

		int minn = min(a[n], b[n]);
		int maxn = max(a[n], b[n]);
		int flag = 0;
		for (int i = 1; i < n; i++)
		{
			if (min(a[i], b[i]) > minn)
			{
				flag = 1;
				break;
			}

			if (max(a[i], b[i]) > maxn)
			{
				flag = 1;
				break;
			}

		}

		if (flag == 0)printf("yes\n");
		else printf("no\n");






	}

	return 0;
}

第一周任务 - Virtual Judge (vjudge.net)

如果R-L>=100,那么就一定能找到最后2位是90的那个数

如果R-L<100,直接暴力


#include
int getmath(int x) {
	int max = -9;
	int min = 1e6;
	while (x)
	{
		int n = x % 10;
		if (n > max)
			max = n;

		if (n < min)
		{
			min = n;
		}

		x /= 10;


	}
	return max - min;
}

int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int L, R;
		int ans=0;
		int max= -1;
		scanf("%d %d", &L, &R);
		if (R - L >= 100)
		{
			ans = L / 100 * 100 + 90;
			if (ans < L)ans += 100;
		}
		else {
			for (int i = L; i <= R; i++)
			{
				if (getmath(i) > max)
				{
					max = getmath(i);
					ans = i;
				}
			}

		}

		printf("%d\n", ans);



	}
	return 0;
}

你可能感兴趣的:(算法,c++,数据结构)