2018牛客网暑期ACM多校训练营(第二场) D - money(贪心)

【题意】
你要按照顺序依次经过n个商店,每到达一个商店你可以购买一件商品,也可以出售你手中的商品。同一时刻你手上最多拿一件商品。在第i个商店购买和出售的代价都是a[i]。
问你经过完n个商店后的最大收益。
同时,在最大化收益的前提下,求最小的交易次数。

【思路】
如果所有相邻商店的代价都不一样,那么最优解一定是在极小值点买入,在极大值点卖出,这样获得的收益是最大的。如果有相邻商店的代价是一样的话,那么可以删掉其它的只留下一个,所以在一开始对数组unique去重一下然后去找极小值和极大值把它们所有差值的和计算出来就可以了。

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll inf=1e17;
const int maxn=100050;

int n;
ll a[maxn];

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        a[0]=inf;
        a[n+1]=-inf;
        for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
        int x=unique(a,a+n+2)-a;
        bool flag=1;//flag==1表示要找极小值买入
        ll ans=0;
        int cnt=0;
        for(int i=1;i<x-1;++i){
            if(flag){
                if(a[i-1]>=a[i] && a[i]<=a[i+1]){
                    ans-=a[i];
                    flag=0;
                    ++cnt;
                }
            }
            else{
                if(a[i-1]<=a[i] && a[i]>=a[i+1]){
                    ans+=a[i];
                    flag=1;
                    ++cnt;
                }
            }
        }
        printf("%lld %d\n",ans,cnt);
    }
    return 0;
}

 

posted @ 2018-07-25 19:20  Somnus、M  阅读(248)  评论(0编辑  收藏  举报