Pokémon Army (easy version) (CodeForces - 1420C1)
题意
给一个数组,按顺序从中选出一些数字,在这些数字中交替穿插 ‘+’ 和 ‘-’ ,求最终能得到的最大值
思路
一个状态机模型,列出状态转移方程即可
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e5 + 5;
LL a[N], f[N][2];
void solve() {
int n, q;
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
for (int i = 1; i <= n; i++) {
f[i][0] = max(f[i - 1][0], f[i - 1][1] + a[i]);
f[i][1] = max(f[i - 1][1], f[i - 1][0] - a[i]);
}
printf("%lld\n", max(f[n][1], f[n][0]));
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
solve();
}
return 0;
}
Rescue Nibel! (CodeForces - 1420D)
题意
给你一个字符串s(下标从1开始,长度为n),你可以进行以下两种操作:
①从区间[2,n-1]这个区间内挑一个x,然后把下标区间为[2,x]这一个子串倒过来追加到原串的头部
②从区间[2,n-1]这个区间内挑一个x,然后把下标区间为[x,n-1]这一个子串倒过来追加到原串的尾部
思路
多试验几个例子后发现只需三步就可以将所有字符串变为回文串
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.size();
puts("3");
printf("L %d\nR %d\nR %d\n", n - 1, n - 1, n * 2 - 1);
return 0;
}