https://www.nowcoder.com/acm/contest/140/D
寻找每一个波峰和波谷,然后计算利润就ojbk。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
const LL maxn = 100000+33;
const LL mod = 1e9+7;
LL a[maxn];
LL v[maxn];
LL cnt;
int main()
{
LL T;
scanf("%lld",&T);
while(T--){
cnt=0;
LL n;scanf("%lld",&n);
for(LL i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
LL len=1;
for(LL i=2;i<=n;i++)
if(a[i]==a[i-1]) continue;
else
a[++len]=a[i];
n=len;
if(n==1){
printf("0 0\n");
continue;
}
v[++cnt]=a[1];
LL now;//1 SHANG
if(a[2]>a[1]) now=1;
else now=0;
for(LL i=3;i<=n;i++){
if(now==1&&a[i]>a[i-1]){
continue;
}else if(now==1){
v[++cnt]=a[i-1];
now=0;
}else if(now==0&&a[i]<a[i-1]){
continue;
}else{
v[++cnt]=a[i-1];
now=1;
}
}
v[++cnt]=a[n];
n=cnt;
if(cnt==1) printf("0 0\n");
else{
LL ans=0;
if(v[1]>v[2]){
for(LL i=2;i<=n;i+=2){
if(i+1>n) continue;
ans+=v[i+1]-v[i];
}
printf("%lld %lld\n",ans,(n-1)/2*2);
}else{
for(LL i=1;i<=n;i+=2){
if(i+1>n) continue;
ans+=v[i+1]-v[i];
}
printf("%lld %lld\n",ans,n/2*2);
}
}
}
return 0;
}