显眼位置放置解题的idea
顺便嘀咕一句,Y总的板子真香~!
题目描述
给定一个长度为 n 的数列 a1,a2,…,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。
求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。
输入格式
第一行输入正整数n。
接下来n行,每行输入一个整数,第i+1行的整数代表ai。
输出格式
第一行输出最少操作次数。
第二行输出最终能得到多少种结果。
数据范围
0<n≤105,
0≤ai<2147483648
输入样例:
4
1
1
2
2
输出样例:
1
2
算法1
C++ 代码
#include <iostream>
#include <cmath>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
LL d[N];
int n;
void insert(int l, int r, int c) {
d[l] += c;
d[r + 1] -= c;
}
int main() {
cin >> n;
for(int i = 1, c; i <= n; i++) {
cin >> c;
insert(i, i, c);
}
LL sum_plus = 0, sum_mius = 0;
for(int i = 2; i <= n; i++)
if(d[i] > 0) sum_plus += d[i];
else if(d[i] < 0) sum_mius += abs(d[i]);
cout << max(sum_plus, sum_mius) << endl
<< abs(sum_plus - sum_mius) + 1 << endl;
return 0;
}
写的挺好的,但是我还是想不明白最后一句话,为什么最终结果的种类就是|正数 - 负数| + 1