CF596B Wilbur and Array题解

同步发布与洛谷(太懒了不想写东西直接搬过来了(((逃 )

原题链接

简单贪心。

题意

求一个起始全为 \(0\) 的数列 \(a_1,a_2 \cdots a_n\) 每次可以选择一个数 \(i\) 使 \(a_i \cdots a_n\) 都加上或减去 \(1\),求修改成给定的序列 \(b_1,b_2 \cdots b_n\) 所需要的最小修改次数是多少。

思路

不难发现,直接从左向右贪心修改,到第 \(i\) 个数的时候,前 \(i-1\) 个数已经是最优状态了,这样修改之后的结果就是最小修改次数,即 \(\left\vert b_i-a_i\right\vert\)

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lc k<<1
#define rc k<<1|1
#define re register
const int N=2e5+10,mod=998244353;
int read() 
{
	int x;
	scanf("%d",&x);
	return x; 
}
void prt(ll x,int op)
{
	if(op==1) cout<<x<<" ";
	if(op==2) cout<<x<<"\n"; 
}
int a[N],b[N],n;
ll ans;
int main()
{
	n=read();
	for(int i=1;i<=n;++i)
	{
		b[i]=read();
	}
	int t=0;
	for(int i=1;i<=n;++i)
	{
		if(t!=b[i])
		{
			int x=b[i]-t;
			ans+=abs(b[i]-t);
			t+=x;
		}
	}
	prt(ans,2);
	return 0;
}
posted @ 2023-10-26 21:56  离弦  阅读(2)  评论(0编辑  收藏  举报