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 }
“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”