P1667 数列(思维好题)

题目链接

题目描述

给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的。现在你有一个操作可以改变数列,选择一个区间[X,Y]满足Ax +Ax+1 +…+ AY<0,1<X<=Y<n,令S=Ax +Ax+1 +…+ AY,对于Ax-1和AY+1分别加上S,Ax和AY分别减去S(如果X=Y就减两次)。问最少几次这样的操作使得最终数列是完美的。
输入输出格式
输入格式:
第一行一个数n,以下n个数。
【数据规模】对于100%的数据,满足1≤N≤10^5; 1≤|A[i]|≤2^31-1。
输出格式:一个数表示最少的操作次数,如果无解输出-1。


一眼看上去,像前缀和,于是手动试了好几组数据后,得出神奇结论:
每次对[l,r]操作,其实是交换sum[l-1]与sum[r](sum为前缀和)
然后再对结果分析得出此题即为通过交换操作把一个无序的前缀和序列变为有序(当有负数或前缀和相等的,即为无解情况)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int n,a[100005];
int sum[100005],sump[100005];
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值