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

    链接:https://www.nowcoder.com/acm/contest/140/D
    来源:牛客网

    White Cloud has built n stores numbered from 1 to n.
    White Rabbit wants to visit these stores in the order from 1 to n.
    The store numbered i has a price a[i] representing that White Rabbit can spend a[i] dollars to buy a product or sell a product to get a[i] dollars when it is in the i-th store.
    The product is too heavy so that White Rabbit can only take one product at the same time.
    White Rabbit wants to know the maximum profit after visiting all stores.
    Also, White Rabbit wants to know the minimum number of transactions while geting the maximum profit.
    Notice that White Rabbit has infinite money initially.

    输入描述:

    The first line contains an integer T(0<T<=5), denoting the number of test cases.
    In each test case, there is one integer n(0<n<=100000) in the first line,denoting the number of stores.
    For the next line, There are n integers in range [0,2147483648), denoting a[1..n].

    输出描述:

    For each test case, print a single line containing 2 integers, denoting the maximum profit and the minimum number of transactions.示例1

    输入

    复制
    1
    5
    9 10 7 6 8

    输出

    复制
    3 4

    分析:我每次只能每一个,然后必须卖掉才能买下一个,中间的利润要最大,交易次数最小
    我们可以在坐标系里标出每个点,横坐标点的位置,纵坐标点的值
    然后我们发现我们所要求得就是每条非递减线段的值
    如下图中,我们要求的就是AB+DE


     注意点值相同的时候要加上这条非递减数列的最后的值,如果不判相等中间断了结果就错了

    #include <map>
    #include <set>
    #include <stack>
    #include <cmath>
    #include <queue>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define debug(a) cout << #a << " " << a << endl
    using namespace std;
    const int maxn = 1e5 + 10;
    const int mod = 10000007;
    typedef long long ll;
    int t,n;
    ll a[maxn],ans,s;
    int main() {
        ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
        cin>>t;
        while(t--){
            ans=s=0;
            cin>>n;
            for(int i=1;i<=n;i++) cin>>a[i];
            if(n<2) {
                cout<<"0 0"<<endl;
                continue;
            }
            int fg=0;
            for(int i=2;i<=n;i++) {
                if(a[i]==a[i-1]) continue;
                if(a[i]>=a[i-1]) ans+=(a[i]-a[i-1]),fg=1;
                else if(fg) s+=2,fg=0;
            }
            if(a[n]>=a[n-1]&&fg) s+=2;
            cout<<ans<<" "<<s<<endl;
        }
        return 0;
    }
    

      

     


    彼时当年少,莫负好时光。
  • 相关阅读:
    使用树莓派打造一个音乐播放器
    关于ESP8266 NodeCMU固件无法刷入新代码的解决方法
    推荐一个好用的免费开源的笔记本软件CherryTree
    忘记数据库密码?通过Navicat找回!!
    Kettle删除日志文件
    windows下解决10点前生成时间命名的文件无效问题
    windows下备份Linux服务器上的MySQL
    Windows下安装mysql
    【EXCEL】按天计算,分摊到每年的费用金额,只用内置函数 无需编写VB
    windows 7 安装visual studio 2019 闪退问题解决
  • 原文地址:https://www.cnblogs.com/l609929321/p/9347363.html
Copyright © 2011-2022 走看看