【Codeforces】 Codeforces Round 865 (Div. 2) (补赛)

传送门

A    Ian Visits Mary

题目大意:

起点为(0,0),给定一对终点点(a,b),你可以至多走两步直线到达终点,路径中最多经过一个整数点;

比如终点(2,2),我一步到终点,会经过整点(1,1),满足;

但是终点(4,4),我一步到终点,会经过整点(1,1)(2,2)(3,3),经过的整点超过一个,不满足;所以我应该得(0,0)→(3,2)→(4,4),这样只有(3,2)一个整点,满足;

解题思路:

参考代码:很容易发现斜率k与经过的整点个数有关,当对于(a,b),如果gcd(a,b)=1,则表示只要起点和(a,b)两个整点,如果不满足gcd(a,b)=1,则需要一个中转点(x,y),满足

gcd(x,y)=1 ,gcd(a-x,b-y)=1,因为1与任何数都互质,所以可以令x=1,b-y=1,直接输出即可

#include
using namespace std;
#define ll long long
int n, a, b;
int main() {
	cin >> n;
	while (n--) {
		cin >> a >> b;
		cout << 2 << endl;
		cout << 1 << ' ' << b - 1 << endl;
		cout << a << ' ' << b << endl;
	}
	return 0;
}

B    Grid Reconstruction

题目大意: 给定1~2*n,填入2 * n 的矩阵里,使得每次走左上走到右下的最小值最大,每次只能往下走或者往右走

解题思路:

对于这个矩阵,权值的加减有规律,比如2*5的矩阵

    + - + - +
- + - + -

有1~2*n的数,为了求最大的最小权值,可以把1~n填到 - 的位置,保证减去的最小,而n+1~2*n填到 + 的位置,保证加的最大,又因为起点和终点一定经过,把最大的或者最小的填到起点和终点即可。

参考代码:

#include
using namespace std;
#define ll long long
const int N = 1e5 + 5;
int n, x;
int f[2][N];
int main() {
	cin >> n;
	while (n--) {
		memset(f, 0, sizeof(0));
		cin >> x;
		f[0][1] = 2 * x;
		int cnt = 1;
		int j = 1;
		for (int i = 1; i <= x; i++) {
			f[j][i] = cnt;
			cnt++;
			j ^= 1;
		}
		j = 1;
		for (int i = 2; i <= x; i++) {
			f[j][i] = cnt;
			cnt++;
			j ^= 1;
		}
		for (int i = 0; i <= 1; i++) {
			for (int j = 1; j <= x; j++) {
				cout << f[i][j] << ' ';
			}
			cout << endl;
		}
	}
	return 0;
}

C   Ian and Array Sorting

题目大意:

解题思路:

参考代码:

D   Sum Graph

题目大意:

解题思路:

参考代码:

E    Between

题目大意:

解题思路:

参考代码:

F    XOR Counting

题目大意:

解题思路:

参考代码:

你可能感兴趣的:(codeforces,c++)