100. 增减序列

给定一个长度为 nn 的数列 a1,a2,,ana1,a2,…,an,每次可以选择一个区间 [l,r][l,r],使下标在这个区间内的数都加一或者都减一。

求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。

输入格式

第一行输入正整数 nn。

接下来 nn 行,每行输入一个整数,第 i+1i+1 行的整数代表 aiai。

输出格式

第一行输出最少操作次数。

第二行输出最终能得到多少种结果。

数据范围

0<n1050<n≤105,
0ai<21474836480≤ai<2147483648

输入样例:

4
1
1
2
2

输出样例:

1
2

 

 题解就不写了,我这找到了一个非常详细的题解,我感觉非常好。这道题目他的问题比较难想。哎题多自然神了。非常好的题解

#include<iostream>
#include<cmath>

using namespace std;

const int N = 1e5 + 10;

int f[N], b[N];

int main(){
	int n;
	cin >> n;
	for(int i = 1; i <= n; i ++) {
		cin >> f[i];
		b[i] = f[i] - f[i - 1];
		
	}
	long long l, r;
	l = 0, r = 0;
	
	for(int i = 2; i <= n; i ++){
		if(b[i] > 0) l += b[i];
		else r -= b[i];
	}
	
	cout << min(l, r) + abs(l - r) << endl;
	cout << abs(l - r) + 1;
	
	
	return 0; 
}

 

posted @ 2022-09-27 20:40  Luli&  阅读(32)  评论(0)    收藏  举报