Codeforces Round #783(Div2) C Make it Increasing

C Make it Increasing


题目链接

题目大概意思是给你一个长度为n的数组a和一个长度为n的数组b,b开始的时候每一个元素都是0,你可以对b数组的每一个位置加上对应的a数组的元素,问你最少经过多少次操作可以使得b单调递增。
拿到题看了一下,肯定有一个点是0,我们只需要枚举每一个位置是0的时候找出最少的次数就可以了,时间复杂度是n2,对于5000绰绰有余,代码如下,记得开long long。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[5005],b[5005];
int main(){
	int n;
	cin>>n;
	for(int i = 1;i<=n;i++){
		cin>>a[i];
	}
	ll ans = (1LL<<60);
	for(int i = 1;i<=n;i++){
		ll res = 0;
		b[i] = 0;
		for(int j = i-1;j>=1;j--){
			if(j == i-1){
				b[j]-=a[j];
				res++;
			}
			else{
				res += (b[j]-b[j+1])/a[j]+1;
				b[j] -= ((b[j]-b[j+1])/a[j]+1)*a[j];
			}
		}
		for(int j = i+1;j<=n;j++){
			if(j == i+1){
				b[j] += a[j];
				res++;
			}
			else{
				res +=(b[j-1]-b[j])/a[j]+1;
				b[j] += ((b[j-1]-b[j])/a[j]+1)*a[j];
			}
		}
		memset(b,0,sizeof(b));
		ans = min(ans,res);
	}
	cout<<ans<<endl;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值