$\huge \color{orange}{成魔之路->}$ $\huge \color{purple}{算法提高课题解}$
思路:
1. 构造差分数组b[i]
2. 目的是让b[2~n]全为零
3. 有多少种结果是指b[1]能取多少种值
4. 用p表示b[2~n]所有正数之和,q表示b[2~n]所有负数之和
5. 最少操作数:min(p,q)+abs(p-q)=max(p-q)
6. 结果数:abs(p-q)+1
操作:
1. 2 <= i, j <= n(优先)
2. i = 1, 2 <= j <= n
3. 2 <= i <= n, j = n + 1
4. i = 1, j = n + 1(没有意义)
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int a[N],b[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i]-a[i-1];
}
int p=0,q=0;
for(int i=1;i<=n;i++)
if(b[i]>0) p+=b[i];
else q-=b[i];
cout<<max(p,q)<<endl;
cout<<abs(p-q)+1<<endl;
return 0;
}