链接:https://www.nowcoder.com/acm/contest/140/D
来源:牛客网
贪心
首先,如果a[i]=a[i+1],则可以删掉第i+1个商店。因为任何在第i+1个商店进行的交易都可以转为在第i个商店
进行,且收益不变。之后,如果a[i]<a[i+1],则离开第i个商店时一定要带上一件商品。如果a[i]>a[i+1],则离开
第i个商店时一定要空着手。这样,第一问的答案就为∑ (n-1,i=1)max(a[i+1]-a[i],0) ,第二问的答案就为长度>1的
极大递增连续段的数量。
分析:这里flag为关键。如果a[i+1]>a[i]连续成立的话,中间是不会有动作的,所以要用flag去判断;如果a[i+1]<a[i]的话,此时应该把商品卖掉利益才会最大,但是如果a[i+1]<a[i[连续成立的话,中间也是不能有动作,所以也用flag判断。最后,如果a[n-1]>a[n]的话,要单独考虑。
#include<iostream>
using namespace std;
#include<cmath>
#include <algorithm>
#include<cstring>
int a[100010];
long long int cost,k,flag;
int main()
{
int t,n;
cin>>t;
while(t--){
cin>>n;
cost=k=flag=0;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n-1;i++){
if(a[i]<a[i+1]&&!flag){ //这里注意两个if里面的flag判断,来保证连续成立时无动作
cost-=a[i];
flag=1;
k++;
}
if(a[i]>a[i+1]&&flag){
cost +=a[i];
flag=0;
k++;
}
}
if(flag){
cost+=a[n-1];
k++;
}
printf("%lld %lld\n",cost,k);
}
return 0;
}