zoukankan      html  css  js  c++  java
  • 10.09T2 贪心

    Description

    applepi训练了一个可以自动在股票市场进行量化交易的模型。通常来说,applepi写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi还是想先检查一下模型的效果。
    applpie收集了“塞帕思股份(surpass)”在最近的连续N天内的价格。在每一天中,他可以做如下事情之一:
    1.睡(把)觉(妹)。
    2.以当天的价格作为成交价买入1股“塞帕思”的股票。
    3.以当天的价格作为成交价卖出1股“塞帕思”的股票。
    最初applepi不持有该股票。现在你需要计算出在最优策略下,N天后applepi能够获得的最大利润。为了维护森林的和平,本着清仓甩锅的原则,在N天的交易结束后applepi也不能持有“塞帕思”的股票。

    Input

    每个测试点包含若干组数据,以EOF结尾。对于每组数据:
    第一行1个整数N。
    第二行N个正整数,相邻两个整数之间用1个空格隔开,表示每一天股票的价格。

    Output

    对于每组数据,首先按样例所示的格式“Case #k:”输出该组数据的编号,然后输出一个整数,表示applepi最大能够获得的利润。

    Sample Input

    6 2 6 7 3 5 6 8 1 2 3 4 5 6 7 8

    Sample Output

    Case #1: 8 Case #2: 16

    Hint

    样例2输入:
    10
    15831 47573 60015 51368 32460 34125 43074 75172 54014 93578
    样例2输出:
    Case #1: 161084

    【数据规模与约定】
    对于50%的数据,1≤N≤1000。
    对于100%的数据,1≤N≤100000,股票价格不超过100000,每个测试点至多包含5组数据。
     
     
     

    这是一道非常裸的贪心题,因为先买后卖,符合时间顺序,所以我们就按着顺序扔进小根堆就行了。

    下面详细介绍下操作:

    每来一个数,扔进堆。

    若当前数大于堆顶,堆顶出,当前数进,ans+=两数之差。其实我们想一想,如果堆顶元素就是在这次卖出的,那么毫无问题,若是在后面卖出的,则后面的那个数一定大于当前数,所以在后面堆处理中,自然当前数会被后面的某个数优化掉,相当于当前数没有进过堆了,下面给出程序。

    注意类似这种没有结束条件的读入一定要用cin读入,scanf容易出锅

    code:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 using namespace std;
     5 int read() {
     6     int x=0,f=1;
     7     char c=getchar();
     8     while(!isdigit(c)) {
     9         if(c=='-')f=-1;
    10         c=getchar();
    11     }
    12     while(isdigit(c)) {
    13         x=(x<<3)+(x<<1)+c-'0';
    14         c=getchar();
    15     }
    16     return x*f;
    17 }
    18 int a[100006];
    19 priority_queue<int>q;
    20 int num=0;
    21 int n;
    22 int main() {
    23     while(cin>>n) {
    24         num++;
    25         long long ans=0;
    26         for(int i=1; i<=n; i++)a[i]=read();
    27         while(!q.empty())q.pop();
    28         for(int i=1; i<=n; i++) {
    29             q.push(-a[i]);
    30             if(a[i]>-q.top()) {
    31                 ans+=a[i]+q.top();
    32                 q.pop();
    33                 q.push(-a[i]);
    34             }
    35         }
    36         cout<<"Case #"<<num<<": "<<ans<<endl;
    37     }
    38     return 0;
    39 }

    over

  • 相关阅读:
    文件操作fopen
    随机数应用
    随机数
    通过命令行参数打开文件
    命令行参数
    内存分区
    const修饰指针+volatile +restrict
    类型限定词——const
    (app笔记)Appium如何开启、配置、启用
    (app笔记)Memory Fill内存填充
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9760249.html
Copyright © 2011-2022 走看看