因为最后n+1位没有考虑到,导致wa了好多次。
思路:将数组划分成多个连续上升子区间,最大利润就是每个子区间端点数值相减,交换次数就是自区间个数的两倍。
注意数组输入的时候先局部去重,因为相邻的元素相等对结果没有影响,而且在写代码的时候会造成麻烦,所以先去重,让相邻两个元素不相等
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define Max int(2e5+10)
int t,n;
ll a[Max];
int main()
{
scanf("%d",&t);
while(t--)
{
ll sum=0,num=0,x;
int r=1,j=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
if(a[j-1]!=x)
a[j++]=x;
}
a[j]=-1;
if(a[2]<a[1])
r=2;
for(int i=3;i<=j;i++)
{
if(a[i]<a[i-1])
{
if(a[i-1]>a[i-2])
{
sum+=a[i-1]-a[r];
// cout<<a[r]<<" "<<a[i-1]<<endl;
num++;
r=i;
}
else
if(a[i]<a[i+1])
r=i;
}
}
printf("%lld %lld\n",sum,2*num);
}
}