AcWing 100 增减序列
题目
给定一个长度为 的数列 ,每次可以选择一个区间 ,使下标在这个区间内的项都加一或者都减一
求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种
分析
对于区间加减的问题,可以考虑用差分数列解决
设 ,那么选择一个区间 加 就等价于 ,区间减 就等价于
所以问题转化为了 从 中任意选出两项,一项加 ,另一项减 ,若干步后使
任选两个项的方法有四种:
而第四类方法只会浪费步骤,所以不考虑
第一种方法在一正一负的情况下可以一次改变两个数的值,应该尽可能采取这种方法
当无法采用第一种方法时,可以采用第二种或第三种
设 为 中的正数项总和, 为负数项总和的绝对值,即:
正负数配对可执行 次方法1,而剩下的数则执行方法2或方法3,一共 次
根据方法2和方法3的选取情况,能产生 种
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
ll a[100000 + 5];
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
ll p = 0, q = 0;
for(int i = 2; i <= n; i++) {
p += max(a[i] - a[i - 1], 0ll);
q += abs(min(a[i] - a[i - 1], 0ll));
}
printf("%lld\n%lld\n", max(p, q), abs(p - q) + 1);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现