Codeforces Round #650 (Div. 3) F1经典离散化DP
比赛链接:Here
1367A. Short Substrings
Description
一个字符串 abac,然后把所有长度为2的子串加起来变成新串,abbaac,由 ab ba ac组成。现在给出新串,找出原串。
直接模拟即可
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
string s; cin >> s;
cout << s[0];
for (int i = 1; i < s.size(); i += 2) cout << s[i];
cout << "\n";
}
}
1367B. Even Array
Description
给定一个数组。有一种操作,可以交换任意两个数的位置。要求的数组奇偶交替出现。最少需要多少次操作。
先统计一遍都多少个奇数不在位置上,和多少个偶数不在位置上。如果不相等,那么无解。反之,把他们放到对应的位置就好了。
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n; cin >> n;
vector<int> a(n);
for (int &x : a) cin >> x;
int cnt0 = 0, cnt1 = 0, ans = 0;
for (int i = 0; i < n; ++i) {
cnt0 += a[i] % 2;
cnt1 += i % 2;
if (i % 2 == 1 && a[i] % 2 == 0) ans += 1;
}
if (cnt0 != cnt1) cout << "-1\n";
else cout << ans << "\n";
}
}
1367C. Social Distance
Description
给定一个01串。需要保证两个相邻的1之间的距离大于k。求原串在不违背题意的情况下,还能插入多少个1。
这个需要分情况考虑。左边连续的0单独计数。右边连续的0单独计数。中间出现的连续的0单独计数。
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n, k; string s;
cin >> n >> k >> s;
int sum = 0, cnt = 0, pre = 0;
k += 1;
bool f = false;
for (int i = 0; i < n; ++i) {
if (s[i] == '0') cnt += 1;
else {
f = true;
if (pre == 0) sum += max(0, cnt / k);
else sum += max(0, (cnt - k + 1) / k);
pre = 1, cnt = 0;
}
}
sum += max(0, cnt / k);
if (!f) sum = max(1 + max(0, (n - 1) / k), sum);
cout << sum << "\n";
}
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n, k; string s;
cin >> n >> k >> s;
int sum = 0, cnt1 = 0, cnt0 = 0;
for (int i = 0; i < n; ++i) {
if (s[i] == '1') {
cnt1 += 1;
if (cnt1 == 1)
sum += cnt0 / (k + 1);
else {
sum += (cnt0 - k) / (k + 1);
cnt1 = 1;
}
cnt0 = 0;
}
if (s[i] == '0') cnt0 += 1;
if (i == n - 1 && s[i] == '0' && cnt1 != 0)
sum += cnt0 / (k + 1);
}
if (cnt1 == 0) sum += (cnt0 + k) / (k + 1);
cout << sum << "\n";
}
}
1367D. Task On The Board
Description
给定s串,删除一些字符,重新组合,得到t串。根据t串,可以计算一个b数组。$b_i = sum(|j-i|)$ if $t_j > t_i$,也就是所有比i位置大的字符的位置差的和。现在给定s和b数组,求t串。
首先肯定是找 \(b\) 数组为 \(0\) 的位置。因为\(0\) ,就表示,没有比他更大的字符了。然后这些位置填上了字符之后,对于非 \(0\) 的位置,他们都是有贡献的。把这些贡献从 \(b\) 数组中减掉,就又会尝试新的 \(0\) 的位置。就循环模拟这个过程就好了。
const int N = 50;
int b[N];
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
string s; int m;
cin >> s >> m;
for (int i = 0; i < m; ++i) cin >> b[i];
int cnt[30] = {};
for (auto c : s) cnt[c - 'a'] += 1;
int r = m, l = 25;
string t(m, '?');
while (r) {
int c = 0;
for (int i = 0; i < m; ++i)
if (!b[i]) c += 1;
while (cnt[l] < c) l -= 1;
for (int i = 0; i < m; ++i) {
if (!b[i]) {
t[i] = 'a' + l;
b[i] -= 1;
r -= 1;
}
}
for (int i = 0; i < m; ++i) {
if (t[i] == 'a' + l)
for (int j = 0; j < m; ++j)
if (b[j] > 0) b[j] -= abs(i - j);
}
l -= 1;
}
cout << t << "\n";
}
}
1367E. Necklace Assembly
Description
给定一堆字符。然后选出len个,围成一圈。且以k为循环节。即每转动k次,这个圈看上去是一模一样的。给定k。求最大的len。
以 \(K\) 为循环节。那么以 \(K\) 的因子 \(K\) 为循环节都可以。所以先枚举 \(K\) 的所有因子。然后对于每个循环节 \(K\) ,如果只由 \(K\) 个元素组成。那显然是可以的。但是要要枚举 \(2*k\) ,可不可以,\(3*k\) 可不可以,直到找到一个最大的 \(n*k\) 可行。那么对于循环节 \(k\) 。最大长度就是 \(n*k\) 。对所有枚举到的取 \(\max\) 就好了。
int check(int k, int cnt[]) {
int tmp = k;
for (int j = 2;; j += 1) {
int tt = 0;
for (int i = 0; i < 26; ++i) tt += cnt[i] / j;
if (tt >= k) tmp = j * k;
else return tmp;
}
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int cnt[100] = {};
string s;
int n, m;
cin >> n >> m >> s;
for (int i = 0; i < n; ++i) cnt[s[i] - 'a'] += 1;
sort(cnt, cnt + 100);
reverse(cnt, cnt + 100);
int ans = 1;
for (int i = 1; i <= m && i <= n; ++i) {
if (m % i == 0)
ans = max(ans, check(i, cnt));
}
cout << ans << "\n";
}
}
1367F1. Flying Sort (Easy Version)
Description
一个数组,一次操作可以选择一个数,放到数组开头,或者放到末尾。问最少多少次操作可以使得数组有序。Easy版中所有元素各不相同。且数组长度 $< 3000$。
超级经典 DP + 离散化处理,一下
考虑求不需要动的元素。先对 \(a\) 数组离散化,变成值域 \(1\sim n\) 的数组。然后不需要动的元素是差值为 \(1\) 的连续上升子序列。DP 求这个最大长度就好了。其他的数都是要移动的。并且要移动一个数。至多只移动一次就好了。所以求出最长子序列长度,再用 \(n\) 减去就是答案了。
const int N = 1e6 + 10;
int a[N], b[N], f[N];
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n; cin >> n;
for (int i = 0; i < n; ++i) cin >> b[i], a[i] = b[i];
sort(b, b + n);
for (int i = 0; i <= n ; ++i) f[i] = 0;
for (int i = 0; i < n; ++i) a[i] = lower_bound(b, b + n, a[i]) - b + 1;
int ans = 0;
for (int i = 0; i < n; ++i) {
f[a[i]] = f[a[i] - 1] + 1;
ans = max(ans, f[a[i]]);
}
cout << n - ans << "\n";
}
}
1367F2. Flying Sort (Hard Version)
AC参考代码
const int N = 2e5 + 10;
int a[N], p[N];
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n; cin >> n;
for (int i = 0; i < n; ++i) cin >> a[i];
iota(p, p + n, 0);
sort(p, p + n, [&](int i, int j) {return a[i] < a[j] || a[i] == a[j] && i < j;});
int ans = 0;
for (int l = 0, r; l < n; l = r) {
for (r = l + 1; r < n && p[r] > p[r - 1]; ++r);
int cnt = r - l;
if (l)
for (int i = l - 1; i >= 0 && a[p[i]] == a[p[l - 1]]; i--)
if (p[i] < p[l]) cnt += 1;
if (r < n)
for (int i = r; i < n && a[p[i]] == a[p[r]]; ++i)
if (p[i] > p[r - 1]) ++ cnt;
ans = max(ans, cnt);
}
for (int l = 0, m, r; l < n; l = m) {
for (m = l; m < n && a[p[m]] == a[p[l]]; ++m);
if (m == n) break;
for (r = m; r < n && a[p[r]] == a[p[m]]; ++r);
for (int i = l, j = m; i < m; ++i) {
while (j < r && p[j] < p[i]) ++j;
ans = max(ans, i + 1 - l + r - j);
}
}
cout << n - ans << "\n";
}
}
Codeforces Round #650 (Div. 3) F1经典离散化DP的更多相关文章
- Codeforces Round #650 (Div. 3) F1. Flying Sort (Easy Version) (离散化,贪心)
题意:有一组数,每次操作可以将某个数移到头部或者尾部,问最少操作多少次使得这组数非递减. 题解:先离散化将每个数映射为排序后所对应的位置,然后贪心,求最长连续子序列的长度,那么最少的操作次数一定为\( ...
- Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】
任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...
- Codeforces Round #521 (Div. 3) F1. Pictures with Kittens (easy version)
F1. Pictures with Kittens (easy version) 题目链接:https://codeforces.com/contest/1077/problem/F1 题意: 给出n ...
- Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...
- Codeforces Round #215 (Div. 2) D题(离散化+hash)
D. Sereja ans Anagrams time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Codeforces Round #545 (Div. 2) C. Skyscrapers 离散化+贪心
题目链接 给你一个n∗m的矩阵res,让你输出一个n∗m的矩阵a,这个矩阵满足:给你一个n*m的矩阵res,让你输出一个n*m的矩阵a,这个矩阵满足:给你一个n∗m的矩阵res,让你输出一个n∗m的矩 ...
- Codeforces Round #547 (Div. 3) F 贪心 + 离散化
https://codeforces.com/contest/1141/problem/F2 题意 一个大小为n的数组a[],问最多有多少个不相交的区间和相等 题解 离散化用值来做,贪心选择较前的区间 ...
- Codeforces Round #650 (Div. 3) C. Social Distance
题目链接:https://codeforces.com/contest/1367/problem/C 题意 给出一个长为 $n$ 的 $01$字符串,两个相邻 $1$ 间距应大于 $k$,初始序列合法 ...
- Codeforces Round #650 (Div. 3) B. Even Array
题目链接:https://codeforces.com/contest/1367/problem/B 题意 有一大小为 $n$ 的数组 $a$,问能否经过交换使所有元素与下标奇偶性相同(0 - ind ...
- Codeforces Round #650 (Div. 3) A. Short Substrings
题目链接:https://codeforces.com/contest/1367/problem/A 题意 给出一个字符串 $t$,找出原字符串 $s$,$t$ 由 $s$ 从左至右的所有长为 $2$ ...
随机推荐
- 神经网络入门篇:详解搭建神经网络块(Building blocks of deep neural networks)
搭建神经网络块 这是一个层数较少的神经网络,选择其中一层(方框部分),从这一层的计算着手.在第\(l\)层有参数\(W^{[l]}\)和\(b^{[l]}\),正向传播里有输入的激活函数,输入是前一层 ...
- Go 获取 IP 地址
1. 获取本地IP地址 使用 net 包可以获取本地机器的 IP 地址.以下是一个获取本地 IP 地址的简单示例: package main import ( "fmt" &quo ...
- [清华集训2017] Hello World!
Hello world! 题目背景 不远的一年前,小 V 还是一名清华集训的选手,坐在机房里为他已如风中残烛的OI 生涯做最后的挣扎.而如今,他已成为了一名光荣的出题人.他感到非常激动,不禁感叹道: ...
- Intellij IDE 对接SVN
1.安装SVN(SVN安装包见附件) 注意安装时需要选择第二个选项进行安装 2.安装SVN中文包(见附件) 安装完成后随便找个文件夹右键确认SVN安装是否生效 3.Intellij IDE得Setti ...
- 如何从零开始实现TDOA技术的 UWB 精确定位系统(4)
这是一个系列文章<如何从零开始实现TDOA技术的 UWB 精确定位系统>第4部分. 重要提示(劝退说明): Q:做这个定位系统需要基础么?A:文章不是写给小白看的,需要有电子技术和软件编程 ...
- ChatGPT的中转站(欧派API) oupuapi,不扶墙也能上楼
开启智能生活新篇章:oupo中转站(欧派)--引领人工智能大模型的枢纽 在人工智能技术日新月异的今天,我们荣幸地向您推介oupo中转站(欧派)--这一汇聚各类顶尖人工智能大模型的平台.它不仅为技术研发 ...
- 简易机器学习笔记(十一)opencv 简易使用-人脸识别、分类任务
前言 前段时间摸了下机器学习,然后我发现其实openCV还是一个很浩瀚的库的,现在也正在写一篇有关yolo的博客,不过感觉理论偏多,所以在学yolo之前先摸一下opencv,简单先写个项目感受感受op ...
- 【pandas小技巧】--目录(完结)
pandas小技巧系列是介绍的是使用pandas分析数据时,最常用的一些操作技巧. 具体包括: 创建测试数据 学习pandas的过程中,为了尝试pandas提供的各类功能强大的函数,常常需要花费很多时 ...
- Luogu P1654 概率DP
原题链接 题意 我们面前有一个长度为\(N\)的01序列,位置 \(a_i\) 有 \(p_i\) 的概率是1,否则为0. 序列中,一段长为 \(x\) 的连续1会带来 \(x^3\) 的加分(这段全 ...
- Spring Boot3 系列:Spring Boot3 跨域配置 Cors
目录 什么是CORS? Spring Boot 如何配置CORS? 前端代码 注解配置 全局配置 过滤器配置 注意事项 什么是CORS? CORS,全称是"跨源资源共享"(Cros ...