A. Strange Splitting
思路
贪心
将题目中的红色元素范围不等于蓝色元素范围改成红色元素范围小于蓝色范围其实是一样的
那么红色元素范围最小是0,要占据一个元素。然后我们只要从数组中找到两个不同的元素就能够使得蓝色元素范围大于0,满足题意。
题目中的 n 是大于等于3的,并且数组是单增的。说明只要数组不是全都是一样的就可以满足上述要求。
code
inline void solve() {
int n; cin >> n;
vector<int> a(n);
for (auto &x : a) cin >> x;
if (a[0] != a[n - 1]) {
cout << "YES\n";
string s = string(n, 'B');
s[1] = 'R';
cout << s << endl;
}else cout << "NO\n";
return;
}
B. Large Addition
思路
模拟
题目要求数位是大数 ,并且两个数的位数相同。
很简单的,两个数相加的时候,必然每次都进位。
但是[5,9]范围里的两个数相加肯定不会出现个数上是9的,还有开头元素一定是1。
注意判断 + 代码模拟相加即可。
code
cpp
inline void solve() {
ll x; cin >> x;
while (x) {
if (x > 0 && x < 10 || x % 10 == 9) return cout << "NO\n", void();
x /= 10;
x -= 1;
}
cout << "YES\n";
return;
}
C1. Magnitude (Easy Version)
思路
dp
我们定义 dp[i][2]。其中dp[i][0]维护到i个构成的最小值,dp[i][1]维护到i个构成的最大值。
对于 dp[i][0] 我们是不会使用option2的,这只会使得它变大,只会用option1
转移为 dp[i][0] = dp[i - 1][0] + a[i]
而对于 dp[i][1] 我们还要考虑 option2 的情况,即最小值加个绝对值的情况,
使用option1的话,a[i] 肯定是跟dp[i - 1][1]的,option2 肯定是跟 dp[i - 1][0]的
所以转移方程为
dp[i][1] = max({dp[i][1], dp[i - 1][1] + a[i] , abs(dp[i - 1][0] + a[i])})
所以得到了 dp[n][1] 作为最终答案
code
cpp
const int N = 2e5 + 9;
ll dp[N][2]; // 前i个的维护的最大和最小值
inline void solve() {
int n; cin >> n;
vector<ll> a(n + 1);
for (int i = 1; i <= n; i ++ ) cin >> a[i], dp[i][1] = 0;
for (int i = 1; i <= n; i ++ ) {
dp[i][0] = dp[i - 1][0] + a[i];
dp[i][1] = max({dp[i][1], abs(dp[i - 1][0] + a[i]), dp[i - 1][1] + a[i]});
}
cout << dp[n][1] << endl;
return;
}