zoukankan      html  css  js  c++  java
  • 2018牛客网暑期ACM多校训练营(第二场) D

    【题意】
    你要按照顺序依次经过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
    ",ans,cnt);
        }
        return 0;
    }
  • 相关阅读:
    P1071 潜伏者
    P2199 最后的迷宫
    推荐
    T150191 求和
    T150189 养猪
    P1106 删数问题
    NOIP 2018 提高组初赛试题胡谈
    结题报告
    博客迁移公告
    简单实用算法——用队列实现栈
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9367835.html
Copyright © 2011-2022 走看看