HDU6438 Buy and Resell

题目链接:https://cn.vjudge.net/problem/HDU-6438

知识点:  贪心

题目大意:

  本题讨论的是同一种物品的买卖。有 n 天,每一天这种物品都有一个价格。每天可以选择购买一个物品,或者出售一个已有的物品,或者什么都不做。问最后最多能赚多少钱,并且在赚最多钱的前提下的最少操作次数是多少?

解题思路:

  Talk is cheap, show me the code.

AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 priority_queue<LL,vector<LL>,greater<LL> > buy;//小顶堆记录能够购买物品的价格
 5 map<LL,int> sell;//记录用各个售价出售了多少件物品
 6 
 7 int main(){
 8     int n,t;
 9     scanf("%d",&t);
10     while(t--){
11         LL profit=0;//总收益
12         int times=0;//交易次数
13         
14         //初始化
15         while(!buy.empty()) buy.pop();
16         sell.clear();
17 
18         scanf("%d",&n);
19         for(int i=0;i<n;i++){//遍历每一天的价格
20             LL cost;
21             scanf("%lld",&cost);
22             if(!buy.empty()&&buy.top()<cost){//如果该天的价格小于buy堆顶的价格
23                 LL temp=buy.top();
24                 buy.pop();
25                 profit+=cost-temp;//更新总收益
26                 times+=2;//更新交易次数
27                 
28                 if(sell[temp]){
29     //如果曾经用目前的这个买入价卖出过物品,那么之前的这个卖出就是没有意义的,把当时的那次
30     //卖出操作抹去,把物品留到现在再卖,总收益是一样的,不过这样可以省下一次卖出操作和一次
31     //买入操作。
32                     times-=2;
33                     buy.push(temp);//抹去曾经的那次买入操作
34                     sell[temp]--;  //抹去曾经的那次卖出操作
35                 }
36                 sell[cost]++;//更新sell
37             }
38             buy.push(cost);//更新buy
39         }
40         cout<<profit<<" "<<times<<endl;
41     }
42 
43     return 0;
44 }

 

posted @ 2018-08-31 18:10  Blogggggg  阅读(151)  评论(0编辑  收藏  举报