求助站外题
  • 板块灌水区
  • 楼主zgy_123
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/6/12 13:37
  • 上次更新2024/6/12 19:04:02
查看原帖
求助站外题
577628
zgy_123楼主2024/6/12 13:37

将一个序列修改成 a1<a2<...<am−1<am>am+1>...>an−1>ana_1<a_2<...<a_{m-1}<a_m>a_{m+1}>...>a_{n-1}>a_n 的形式(只要存在 mm 即可),一次修改定义为将 [l,r][l,r] 区间内的数都加一,求最少修改次数。

我的思路:确定 mm,然后这时答案即为:max(调整左边的最小修改次数,调整右边的最小修改次数)。

#include<bits/stdc++.h>
using namespace std; 
long long a[4000005];
long long dp_1[4000005],dp_2[4000005];
//dp_1[i] 1~i 升序的最小花费
//dp_2[i] i~n 降序的最小花费
int main(){
	int n;
	long long ans=9e18;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++) dp_1[i]=dp_1[i-1]+max(0ll,a[i-1]-a[i]+1);
	for(int i=n;i>=1;i--) dp_2[i]=dp_2[i+1]+max(0ll,a[i+1]-a[i]+1);
	for(int i=1;i<=n;i++) ans=min(ans,max(dp_1[i],dp_2[i]));
	for(int i=1;i<=n;i++) printf("%lld\n",max(dp_1[i],dp_2[i]));
	printf("%lld",ans);
	return 0;
}

全Wa。

2024/6/12 13:37
加载中...