Codeforces Round #695 (Div. 2)
Codeforces Round #695 (Div. 2)
A. Wizard of Orz
题意:给定一排
思路:要使显示数字最大,使首位为
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
for (cin >> _; _--;) {
int n; cin >> n;
cout << 9;
for (int i = 1; i < n; ++i) cout << (i + 7) % 10;
cout << "\n";
}
return 0;
}
B. Hills And Valleys
山谷定义看题意,循环一次数组把 山谷和
。
模拟的时候发现 ans 其实最多为 2(0,1,2),
比如在 6 1 5 4 5,这组数据把
替换为 1 时 ans = 2.
具体代码实现
using ll = long long;
int _, n;
vector<ll> a;
bool check(int i) {
if (i == 0 || i == n - 1) return false;
return (a[i] > a[i + 1] && a[i] > a[i - 1]) ||
(a[i] < a[i + 1] && a[i] < a[i - 1]);
}
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
for (cin >> _; _--;) {
cin >> n;
a = vector<ll>(n);
for (auto& x : a) cin >> x;
int ans = 0, cnt = 0;
for (int i = 1, b, c; i < n - 1; ++i) {
int t = a[i];
cnt += check(i);
b = c = check(i) + check(i - 1) + check(i + 1);
a[i] = a[i + 1], b -= check(i - 1);
a[i] = a[i - 1], c -= check(i + 1);
ans = max({ans, b, c});
a[i] = t;
}
cout << cnt - ans << "\n";
}
return 0;
}
C. Three Bags
我们有三个背包,可以进行一种操作:
- 移除一个背包中的一个数b,另一个背包中的一个数a变为a-b
问我们最后剩余的一个数最大可以为多少?
那么我们可以考虑最后剩余的一个数在哪个背包中,我们以在A背包中为例。
我们有三个背包,可以进行一种操作:
- 移除一个背包中的一个数b,另一个背包中的一个数a变为a-b
问我们最后剩余的一个数最大可以为多少?
那么我们可以考虑最后剩余的一个数在哪个背包中,我们以在A背包中为例。
对于A背包中的数来说
我们将A背包的数作为b转移出去,再转移回来,负负得正,那么最后一个数可以加上A背包中所有的数的和
那么对于B和C背包来说有两种情况
- B背包和C背包都剩下一个数,B、C背包中其他的数通过除了A之外的另一个背包先转换为
-b
,再转移到A背包中变为b
,随后在A背包中减去B、C背包中剩下的这个数,那么显然,当剩下的这两个数最小时,结果最优。 - B背包和C背包只有一个背包剩下一个数,那么这种情况就是,其中一个背包全部作为
-b
转移到除了A背包之外的另一个背包,再转移到A背包中就变为了b
,剩下的那个背包全部作为-b
转移到A背包中。
我们将A背包的数作为b转移出去,再转移回来,负负得正,那么最后一个数可以加上A背包中所有的数的和
那么对于B和C背包来说有两种情况
- B背包和C背包都剩下一个数,B、C背包中其他的数通过除了A之外的另一个背包先转换为
-b
,再转移到A背包中变为b
,随后在A背包中减去B、C背包中剩下的这个数,那么显然,当剩下的这两个数最小时,结果最优。 - B背包和C背包只有一个背包剩下一个数,那么这种情况就是,其中一个背包全部作为
-b
转移到除了A背包之外的另一个背包,再转移到A背包中就变为了b
,剩下的那个背包全部作为-b
转移到A背包中。
using ll = long long;
int _;
vector<ll> w[3];
vector<int> n(3);
ll cal() {
ll ans = 0, s1 = 0, s2 = 0, m1 = w[1][0], m2 = w[2][0];
for (int i = 0; i < n[0]; i++) ans += w[0][i];
for (int i = 1; i < n[1]; i++) s1 += w[1][i];
for (int i = 1; i < n[2]; i++) s2 += w[2][i];
ans += max({s1 + s2 - m1 - m2, s1 + m1 - s2 - m2, s2 + m2 - s1 - m1});
return ans;
}
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
for (int i = 0; i < 3; ++i) cin >> n[i];
w[0].resize(n[0]), w[1].resize(n[1]), w[2].resize(n[2]);
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < n[i]; ++j) cin >> w[i][j];
sort(w[i].begin(), w[i].end());
}
ll ans = -1e18;
// 现在考虑三种情况
ans = max(ans, cal()); // A,B,C
swap(w[0], w[1]), swap(n[0], n[1]);
ans = max(ans, cal()); // B,A,C
swap(w[0], w[2]), swap(n[0], n[2]);
ans = max(ans, cal()); // C,A,B
cout << ans << "\n";
return 0;
}
D. Sum of Paths
题意
有个机器人在
思路
对于每一个方格,枚举他作为中转点即可。
using ll = long long;
const int MXN = 5e3 + 10;
const int mod = 1e9 + 7;
ll a[MXN];
ll dp[MXN][MXN];
ll sum[MXN];
int main() {
int n, k, q;
cin >> n >> k >> q;
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}
for (int i = 1; i <= n; i++) dp[0][i] = 1;
for (int i = 1; i <= k; i++) {
dp[i][1] = dp[i - 1][2];
dp[i][n] = dp[i - 1][n - 1];
for (int j = 2; j < n; j++) {
dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j + 1]) % mod;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++)
sum[i] = (sum[i] + dp[j][i] * dp[k - j][i] % mod) % mod;
}
ll ans = 0;
for (int i = 1; i <= n; i++) ans = (ans + sum[i] * a[i] % mod) % mod;
while (q--) {
ll i, x;
scanf("%lld%lld", &i, &x);
ans =
((ans - sum[i] * a[i] % mod + sum[i] * x % mod) % mod + mod) % mod;
cout << ans << '\n';
a[i] = x;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战