【ybt高效进阶强化训练1-2-4】修改序列(贪心)
修改序列
题目链接:ybt高效进阶强化训练1-2-4
题目大意
给你一个序列,问你要至少修改多少个数,使得对于 i = 1 ∼ n − 1 i=1\sim n-1 i=1∼n−1,有 a i + 1 = a i + i a_{i+1}=a_i+i ai+1=ai+i。
思路
首先不难发现,如果你确定了任意个一个位置,那别的位置都确定了。
而且某两个位置之间的数是有一一对应的关系。
那我们可以通过简单的计算算出要让当前位置不改动,第一个位置要是什么。
那我们找到的相同的,就是可以一起不修改的,其他的就是要修改的。
那我们用一个 map 实现即可。
代码
#include<map>
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
int n, ans;
int a[100001];
ll pl[100001];
map <ll, int> st;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
st[1ll * a[i] - 1ll * (1 + i - 1) * (i - 1) / 2] = 0;
}
for (int i = 1; i <= n; i++) {//记录有多少个位置要第一个数是 x,得到 st[x],再用 pl 数组记录 st[x]>0 的 x
st[1ll * a[i] - 1ll * (1 + i - 1) * (i - 1) / 2] = st[1ll * a[i] - 1ll * (1 + i - 1) * (i - 1) / 2] + 1;
if (st[1ll * a[i] - 1ll * (1 + i - 1) * (i - 1) / 2] == 1)
pl[++pl[0]] = 1ll * a[i] - 1ll * (1 + i - 1) * (i - 1) / 2;
}
for (int i = 1; i <= pl[0]; i++)//找到同一个起点最多的
ans = max(ans, st[pl[i]]);
printf("%d", n - ans);//除了你选的起点的,其它的都要改
return 0;
}
相关文章
- Python 时间序列异常点检测 | tsmoothie 基于数据平滑/拟合的方法 简单却快速有效
- 【LeetCode】递增的三元子序列 [M](动态规划)
- 机器学习笔记七-----------------使用Prophet(时间序列模型)预测家用电量的数据的笔记一------数据集解析
- 时间序列-第三方库:tsfresh【特征提取、特征选择】
- Pandas-时间序列(三)-重采样:改变TimeSeries的采样频率【降采样:高频数据 → 低频数据(以天为频率转为以月为频率)】【升采样:低频数据 → 高频数据(以年为频率转为以月为频率)】
- C++STL模板库序列容器之deque
- hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明
- PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
- 动态规划法——最长公共子序列问题
- LeetCode_回溯_中等_491.递增子序列
- 1265:【例9.9】最长公共子序列 2021-01-15
- 《中国人工智能学会通讯》——12.2 大数据环境下序列模式挖掘及应用
- python核心编程学习记录之序列(字符串元组列表)
- NLP自然语言处理系列-时间序列数据分析-降采样、升采样、数据统计-滑动窗口
- AcWing 1016. 最大上升子序列和