Codeforces Round #802 (Div. 2)C. Helping the Nature(差分)
题目链接
题目大意:
给你一个有n个元素的数组a,你可以通过一下三种操作使数组的每一个值都为0:
- 选择一个下标i,然后让a[1],a[2]....a[ i ] 都减一;
- 选择一个下标i,然后让a[i],a[i+1]....a[n] 都减一;
- 让每一个值都加一
问让整个数组的值都为0的最小操作数。
题目思路:
我们观察所有操作,发现其都是让一个连续区间都减去一个相同的数,或者加上一个相同的数,这与差分十分相似,所以我们将其转化为差分操作:
1.a[1]-1,a[i+1]+1
2.a[i]-1
3.a[1]+1
因为操作1每次都会改变两个元素的值,所以根据贪心的思想我们要尽量多的使用操作1
所以我们将原数组转化为差分数组,应用操作即可
代码实现:
# include<iostream> # include<bits/stdc++.h> using namespace std; # define int long long # define endl "\n" const int N = 2e5 + 10; int a[N]; int b[N]; void solve() { int n; cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; for (int i = 1; i <= n; ++i) b[i] = a[i] - a[i - 1]; int ans = 0; for (int i = 2; i <= n; ++i) { if (b[i] < 0) {//小于0使用操作1 b[1] += b[i]; ans += abs(b[i]); } else ans += b[i];//大于0使用操作2 } ans += abs(b[1]);//最后对a[1]看需要使用操作2还是操作3 cout << ans << endl; } int tt; signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); tt = 1; cin >> tt; while (tt--)solve(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!