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;
    }
  • 相关阅读:
    hdu 1086 You can Solve a Geometry Problem too 求n条直线交点的个数
    2019 上半年 南昌网络赛
    第十章 存储过程和函数
    第九章 Mysql函数
    第八章 Mysql运算符
    第七章 插入、更新与删除数据
    第六章 查询数据
    第五章 触发器
    第四章 视图
    第三章 索引
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9367835.html
Copyright © 2011-2022 走看看