题目链接:点击这里
本题要求将数组元素化为相同的元素,相当于对差分数组 都置为 。
对差分数组 可以进行下面四种操作:
(1)
(2)
(3)
(4)
要求操作数最少,根据贪心思想,优先选择第一种操作,即进行 次操作。
第一种结束后,正数和 与负数和 绝对值之差可能不为 ,我们接着选择第二或第三种操作都可以,又进行 次操作。
再来考虑最终得到的数列可能有多少种。
我们选第二种操作的次数是 ,对应选第三种操作的次数是 ,一共 种选择,对应着 种不同结果。
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 100010;
int a[maxn];
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
for(int i = n; i > 1; --i)
a[i] -= a[i-1]; //求差分,这里必须逆序
ll pos = 0, neg = 0;
for(int i = 2; i <= n; ++i)
{
if(a[i]>0) pos += a[i];
else neg -= a[i];
}
printf("%lld\n", min(pos,neg) + abs(pos-neg));
printf("%lld\n", abs(pos-neg) + 1);
return 0;
}