链接:https://ac.nowcoder.com/acm/contest/5758/B
来源:牛客网
题目描述
存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一。问最少多少次操作,可以让所有数都变成1。
数据保证一定有解。
输入描述:
输入t,代表有t组数据。每组数据输入n,代表有n个数。接下来一行输入n个数,数字大小小于1e6。(t<=1000,n<1e5,∑n < 1e6)
输出描述:
每组数据输出一个整数代表最少需要操作的次数。
示例1
输入
复制
1
6
1 3 5 2 7 1
输出
复制
9
基本思路:我们求出差分数组,可以发现题意就是让我们每次将差分数组-1,+1,最后将差分数组变为第一个数为1其他数都为0的最小次数,因此实际答案就是差分数组中的正数之和减一。
#include <bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
long long sum = 0;
for(int i = 1 ; i <= n ; i++)
{
scanf("%d",&a[i]);
if(a[i] - a[i-1] > 0)
{
sum+=a[i] - a[i-1];
}
}
printf("%lld\n",sum-1);
}
return 0;
}