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),满足
,因为1与任何数都互质,所以可以令x=1,b-y=1,直接输出即可
#include<bits/stdc++.h>
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<bits/stdc++.h>
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
题目大意:
解题思路:
参考代码: