T1.矩阵转置

题意:

给定一个HHWW列的矩阵AAAA中从上往下第ii行、从左往右第jj列的元素为Ai,jA _{i,j}。定义BB为一个WWHH列的矩阵,其中从上往下第ii行从左往右第jj列的元素等于Aj,iA_{j,i}。也就是说,BBAA的转置矩阵。请 输入 输出BB

数据范围:

$1 ≤ H, W ≤ 10 ^ 5 \\ H \times W ≤ 10 ^ 5 \\ 1 ≤ A_{i, j} ≤ 10 ^ 9$

输入中的所有值均为整数

思路:

通过样例可得,其实就是把AA数组一列一列的输出,但是1H,W1051 ≤ H, W ≤ 10 ^ 5, 1052=101010 ^ {5 ^ {2}} = 10 ^ {10},而256MB256\rm{MB}内存空间只能开 1古戈尔普勒克斯 6.1×1076.1 \times 10 ^ 7的空间,所以只能用vector的二维数组或输入了WWHH再定义int A[W][H]

代码:

#include <bits/stdc++.h>
using namespace std;

int w, h;//用大写不方便,所以我用的是小写

int main ()
{
	cin >> h >> w;
	int a[h + 10][w + 10] = {}, b[w + 10][h + 10] = {};//这里数组开大了一点,怕数组越界
    //输入
	for (int i = 0; i < h; i++)
	{
		for (int j = 0; j < w; j++)
		{
			cin >> a[i][j];
			b[j][i] = a[i][j];
		}
	}
    //输出
	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j < h; j++) cout << b[i][j] << ' ';
		cout << "\n";
	}
	return 0;
}

T2.chess960

题意:

给定一个长度为88的字符串SSSS中恰好包含一个KK、一个QQ、两个RRBBNN。判断SS是否满足以下条件:

  • 假设SS从左数第xx个和第yy(x<y)(x < y)字符是BB那么,xxyy的奇偶性不同。

  • KK位于两个RR之间。更正式地说,假设SS中从左数第xx个和第yy个(x<yx<y)字符是RR,第zz个字符是KK;那么x<z<yx<z<y

思路:

根据题目所述判断就行。(就是代码有点长)

代码:

#include <bits/stdc++.h>
using namespace std;

string s;
int b = -1;

bool bs (int l, int r)
{
	for (int i = l; i <= r; i++)
	{
		if (s[i] == 'R') return false;
	}
	return true;
}

int main ()
{
	cin >> s;
	for (int i = 0; i < 8; i++)
	{
		if (s[i] == 'B')
		{
			if (b == -1) b = i;
			else
			{
				if ((b + i) % 2 == 0)
				{
					cout << "No";
					return 0;
				}
			}
		}
		else if (s[i] == 'K')
		{
			if (i == 0 || i == 7)
			{
				cout << "No";
				return 0;
			}
			else
			{
				bool tl = bs(0, i - 1), tr = bs(i + 1, 7);
				if (tl || tr)
				{
					cout << "No";
					return 0;
				}
			}
		}
	}
	cout << "Yes";
	return 0;
}

T3.我喜欢因式分解

题目:

给定一个整数XX,找出一对整数(A,B)(A,B),使得A5B5=XA^5−B^5=X保证对于给定的整数XX,存在这样的一对整数。

思路:

虽说1X 1010100 1091 ≤ X ≤ ~ \cancel{10^{10^{100}}} ~ 10^9,但是AABB的范围只有200200-200 ~ 200,两层循环嵌套直接秒了。

(真不知道自己是怎么回事,怎么这么简单都想不到······)

代码

#include <bits/stdc++.h>
using namespace std;

int x;

int main ()
{
	cin >> x;
	for (int a = -200; a <= 200; a++)
	{
		for (int b = -200; b <= 200; b++)
		{
			if (pow(a, 5) - pow(b, 5) == x)
			{
				cout << a << ' ' << b;
				return 0;
			}
		}
	}
	return 0;
}

$$\purple{\rm{1161041010101110100}}$$

$$\purple{\rm{the~~end}}$$