【每日一题】Problem 253B. Physics Practical
1.【每日一题】Problem 363B. Fence2.【每日一题】Problem 331C1. The Great Julya Calendar3.【每日一题】Problem 327A - Flipping Game4.【每日一题】Problem 313B - Ilya and Queries5.【每日一题】Problem 1832B - Maximum Sum6.【每日一题】Problem 44E. Anfisa the Monkey7.【每日一题】Problem 120F. Spiders8.【每日一题】Problem 174B. File List9.【每日一题】Problem 180C. Letter10.【每日一题】Problem 189A. Cut Ribbon11.【每日一题】Problem 234C. Weather
12.【每日一题】Problem 253B. Physics Practical
13.【每日一题】Problem 443B. Kuriyama Mirai's Stones14.【每日一题】Problem 416B. Art Union15.【每日一题】Problem 489B. BerSU Ball16.【每日一题】Problem 476B. Dreamoon and WiFi17.【每日一题】Problem 489C. Given Length and Sum of Digits...18.【每日一题】Problem 505B. Mr. Kitayuta's Colorful Graph19.【每日一题】Problem 289B. Polo the Penguin and Matrix20.【每日一题】Problem 414B. Mashmokh and ACM21.【每日一题】Problem 522A. Reposts22.【每日一题】Problem 1195C. Basketball Exercise23.【每日一题】Problem 538B. Quasi Binary解决思路
- 定义
为对 元素做出选择后,要删除的最少元素个数 - 对于
,有两种情况,选或不选- 选:则找到
的个数,可以通过排序二分实现 - 不选:则在
的最少删除个数的选择下
- 选:则找到
#include <bits/stdc++.h>
int binarySearch(std::vector<int> &a, int target) {
int l, r; l = 0, r = a.size() - 1;
while (l <= r) {
int mid = (r - l) / 2 + l;
if (a[mid] <= target) l = mid + 1;
else r = mid - 1;
}
return l;
}
int main() {
std::freopen("input.txt", "r", stdin);
std::freopen("output.txt", "w", stdout);
int n;
std::cin >> n;
std::vector<int> c(n + 1, 0);
for (int i = 1; i <= n; ++i) std::cin >> c[i];
std::sort(c.begin() + 1, c.end());
std::vector<std::vector<int>> dp(n + 1, std::vector<int>(2, 0));
int index = binarySearch(c, c[1] * 2);
dp[1][0] = 1;
dp[1][1] = c.size() - index;
for (int i = 2; i <= n; ++i) {
index = binarySearch(c, c[i] * 2);
dp[i][0] = std::min(dp[i - 1][0], dp[i - 1][1]) + 1;
dp[i][1] = std::min(int(c.size()) - index + dp[i - 1][0], dp[i - 1][1]);
}
std::cout << std::min(dp[n][0], dp[n][1]) << std::endl;
}
更好的解
将二维数组替换为一维滚动数组
- 需要注意的是,
和 都相互依赖对方更新前的值,因此需要先做一次备份
#include <bits/stdc++.h>
int binarySearch(std::vector<int> &a, int target) {
int l, r; l = 0, r = a.size() - 1;
while (l <= r) {
int mid = (r - l) / 2 + l;
if (a[mid] <= target) l = mid + 1;
else r = mid - 1;
}
return l;
}
int main() {
std::freopen("input.txt", "r", stdin);
std::freopen("output.txt", "w", stdout);
int n;
std::cin >> n;
std::vector<int> c(n + 1, 0);
for (int i = 1; i <= n; ++i) std::cin >> c[i];
std::sort(c.begin() + 1, c.end());
std::vector<int> dp(2, 0);
dp[1] = n + 1;
for (int i = 1; i <= n; ++i) {
int index = binarySearch(c, c[i] * 2);
int t = dp[0]; // dp[1] 依赖更新前的 dp[0], 做一层备份
dp[0] = std::min(dp[0], dp[1]) + 1;
dp[1] = std::min(int(c.size()) - index + t, dp[1]);
}
std::cout << std::min(dp[0], dp[1]) << std::endl;
}
本文来自博客园,作者:HelloEricy,转载请注明原文链接:https://www.cnblogs.com/HelloEricy/p/17489810.html
合集:
每日一题
分类:
每日一题 / 动态规划
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步