五一摆五天 状态下滑场(小丑场)
A. Maximize?
这次的签到题终于和以往的风格不一样了
给定 找到g(x,y)+y 中最大的y
gcd欧几里得算法
暴力枚举1~x-1
#include <iostream>
using namespace std;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int main(void) {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
int res = 0;
int y = 0;
for (int i = 1; i < n; i++) {
if (gcd(n, i) + i > res) {
res = gcd(n, i) + i;
y = i;
}
}
cout << y << endl;
}
return 0;
}
B题双指针匹配
比赛时就做出了这两题 甚至连思路也是莫名其妙的
重头戏在T3 写了快1小时 还是写不出 真的很小丑
这里就来复盘一下C题吧,没写到的题以后再说(目前还是缺很多东西,补题的话目前的计划是
补看了题目没思路的 或者有一点点感觉又写不出的QAQ)
每次测试的时间限制:2 秒
每次测试的内存限制:256 兆字节
输入:标准输入
输出:标准输出
系统会给出一个数组
x
2
,
x
3
,
…
,
x
n
x_2,x_3,\dots,x_n
x2,x3,…,xn。您的任务是查找 any 数组
a
1
,
…
,
a
n
a_1,\dots,a_n
a1,…,an,其中:
- 1 ≤ a i ≤ 1 0 9 1\le a_i\le 10^9 1≤ai≤109 所有 1 ≤ i ≤ n 1\le i\le n 1≤i≤n。
- x i = a i m o d a i − 1 x_i=a_i \bmod a_{i-1} xi=aimodai−1 对于所有 2 ≤ i ≤ n 2\le i\le n 2≤i≤n。
这里 c m o d d c\bmod d cmodd 表示整数 c c c 除以整数 d d d 的余数。例如, 5 m o d 2 = 1 5 \bmod 2 = 1 5mod2=1, 72 m o d 3 = 0 72 \bmod 3 = 0 72mod3=0, 143 m o d 14 = 3 143 \bmod 14 = 3 143mod14=3。
**请注意,如果有多个满足该语句的
a
a
a,您可以找到任何。
输入
第一行包含一个整数 t t t ( 1 ≤ t ≤ 1 0 4 ) (1\le t\le 10^4) (1≤t≤104) — 测试用例的数量。
每个测试用例的第一行包含一个整数 n n n ( 2 ≤ n ≤ 500 ) (2\le n\le 500) (2≤n≤500) — a a a 中的元素数。
每个测试用例的第二行包含 n − 1 n-1 n−1 整数 x 2 , … , x n x_2,\dots,x_n x2,…,xn ( 1 ≤ x i ≤ 500 ) (1\le x_i\le 500) (1≤xi≤500) — x x x 的元素。
保证所有测试用例的值
n
n
n 的总和不超过
2
⋅
1
0
5
2 \cdot 10^5
2⋅105。
输出
对于每个测试用例,输出满足语句的任何
a
1
,
…
,
a
n
a_1,\dots,a_n
a1,…,an (
1
≤
a
i
≤
1
0
9
1 \le a_i \le 10^9
1≤ai≤109)。
注意
在第一个测试用例中, a = [ 3 , 5 , 4 , 9 ] a=[3,5,4,9] a=[3,5,4,9] 满足条件,因为:
- a 2 m o d a 1 = 5 m o d 3 = 2 = x 2 a_2\bmod a_1=5\bmod 3=2=x_2 a2moda1=5mod3=2=x2;
- a 3 m o d a 2 = 4 m o d 5 = 4 = x 3 a_3\bmod a_2=4\bmod 5=4=x_3 a3moda2=4mod5=4=x3;
- a 4 m o d a 3 = 9 m o d 4 = 1 = x 4 a_4\bmod a_3=9\bmod 4=1=x_4 a4moda3=9mod4=1=x4;
这题是开放题 应该叫做构造? 就是满足条件的答案就可以通过
题目的意思是给定一个长度为n-1的x数组,求解出长度为n的a数组
其中
用例:
这题的正确思路是: 从mod的性质下手:
a mod b =r (r∈1~b-1)
观察式子可以发现 余数一定比除数小
这是我们发现的第一点性质
我们现在只知道余数(x数组)
那么不妨就设定
a1=x2+1
这样 a1即是除数b满足大于x2
那么假设知道除数b了
被除数就要根据进一步分解的式子求得:
a mod b = r
a - k*b = r
a = k*b+r
由于a又作为下一个的b
所以保证a 大于下一处的r即可
#include <iostream>
using namespace std;
const int N = 510;
typedef long long LL;
int a[N], x[N];
int main(void) {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
for (int i = 2; i <= n; i++) {
cin >> x[i];
}
a[1] = x[2] + 2;//初始化 大于x2即可
for (int i = 2; i <= n; i++) {
a[i] = a[i - 1] + x[i];//默认k=1
while (a[i] <= x[i + 1])//a[i] 作为x[i+1]的b
a[i] += a[i - 1];//调整K
}
for (int i = 1; i <= n; i++)
cout << a[i] << ' ';
puts("");
}
return 0;
}
其实就差一点 我就写出来了 我只知道式子和展开 但是我不会分析 还是得多思考