「题解」Codeforces Round 894 (Div. 3)
A. Gift Carpet
Problem
Sol & Code
签到题
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
typedef long long ll;
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int T, n, m, a[4];
std::string s[N];
int main() {
scanf("%d", &T);
a[0] = 'v', a[1] = 'i', a[2] = 'k', a[3] = 'a';
while (T--) {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) std::cin >> s[i];
int cnt = 0, okay = 0;
for (int j = 0; j < m; ++j) {
for (int i = 1; i <= n; ++i) {
if (s[i][j] == a[cnt]) {
++cnt;
break;
}
}
if (cnt == 4) { okay = 1; break; }
}
puts(okay ? "YES" : "NO");
}
return 0;
}
B. Sequence Game
Problem
Sol & Code
升序直接接到答案序列后,降序先加个一在答案序列后再加入答案序列。
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
typedef long long ll;
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int T, n, ans[N << 1];
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
int last, cnt = 0;
scanf("%d", &last);
ans[++cnt] = last;
for (int i = 2, x; i <= n; ++i) {
scanf("%d", &x);
if (x >= last) { ans[++cnt] = x; last = x; }
else { ans[++cnt] = 1, ans[++cnt] = x; last = x; }
}
printf("%d\n", cnt);
for (int i = 1; i <= cnt; ++i) {
printf("%d ", ans[i]);
}
puts("");
}
return 0;
}
C. Flower City Fence
Problem
Sol & Code
长度为 的木板会对 有 的贡献,可以差分记录贡献最后看两种摆放时候一致。
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
typedef long long ll;
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int T, n, a[N], ans[N];
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) ans[i] = 0, scanf("%d", &a[i]);
std::sort(a + 1, a + n + 1);
if (a[n] != n) { puts("NO"); continue; }
for (int i = 1; i <= n; ++i) {
++ans[1], --ans[a[i] + 1];
}
bool okay = true;
for (int i = 1; i <= n; ++i) {
ans[i] += ans[i - 1];
if (ans[i] != a[n - i + 1]) { okay = false; break; }
}
if (okay) puts("YES");
else puts("NO");
}
return 0;
}
D. Ice Cream Balls
Problem
Sol & Code
种不同的球有 种不同的组合,相同种类的球有 种组合,计算出不超出题目要求的最大的 最后加上剩余数量即可。
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
typedef long long ll;
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
ll n;
int T;
int main() {
scanf("%d", &T);
while (T--) {
scanf("%lld", &n);
ll k = sqrt(2ll * n);
while (k * (k - 1) <= 2ll * n) ++k;
while (k * (k - 1) > 2ll * n) --k;
printf("%lld\n", k + (n - k * (k - 1) / 2));
}
return 0;
}
E. Kolya and Movie Theatre
Problem
Sol & Code
假设我们在 三天去看电影,那么 的贡献为 可见 的贡献只与最后是在哪天看的电影有关。
枚举这个最后一天 ,想要知道最后一天为 的答案还要统计前 个数中最多选 个数的和的最大值,优先队列可做。
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
typedef long long ll;
ll max(ll a, ll b) { return a > b ? a : b; }
int T, n, m, d;
std::priority_queue<int> q;
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d %d %d", &n, &m, &d);
ll ans = 0, res = 0;
for (int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
if (x > 0) {
if (q.size() < m) {
q.push(-x);
res += x;
} else {
if (-q.top() < x) {
res += q.top();
q.pop();
res += x;
q.push(-x);
}
}
ans = max(ans, res - 1ll * i * d);
}
}
printf("%lld\n", ans);
while (!q.empty()) q.pop();
}
return 0;
}
F. Magic Will Save the World
Problem
Sol & Code
发现时间越久成功概率越大即有单调性,二分答案。
问题来到了如何判断是否可行。
问题可以转化为有两个背包,容量分别为 能否将物品全部装下,因此每个背包要尽量装,计算一次 背包看剩下的物品能否用另一个背包装下即可。
复杂度好像有点悬,加个小优化。
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
typedef long long ll;
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int g[1000518];
int T, n, w, f, s[N], pre[N];
bool check(int k) {
ll a = 1ll * k * w, b = 1ll * k * f;
for (int i = 0; i <= n; ++i) {
if (pre[i] <= a && pre[n] - pre[i] <= b) return true;
if (pre[i] > a) break;
}
for (int i = a; i >= 0; --i) g[i] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = a; j >= s[i]; --j) {
g[j] = max(g[j], g[j - s[i]] + s[i]);
}
}
return (pre[n] - g[a] <= b);
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d %d", &w, &f);
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &s[i]);
pre[i] = pre[i - 1] + s[i];
}
int l = 1, r = 1000000;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid - 1;
else l = mid + 1;
}
printf("%d\n", r + 1);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App