hdu 6438 Buy and Resell

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6438

题意:商人Noswal每天去一个城市(有序),购买或贩卖(二选一)power cube,城市 i 的物价为 a[i], 求其最大获利(ans)以及在此情况下的最少交易次数(cnt)。

思路:维护一个从小到大的优先队列,队中元素为pair<物价,暂定交易性质(1为卖, 2为买)>。(物价x相等时,“卖”被优先替换,以保证交易次数cnt最少)。

           对于后去的每个城市的物价x, 与队首元素(top)(当前物价最小城市)进行对比,

                  若x <= top.first则舍弃x。

                  否则,ans += x - top.fist; 

                         若top.second == 2(购买),则交易次数cnt += 2;并将其替换为(x, 1)

       若top.second == 1(贩卖),则该top并非最优选项,之前被替换的cube可以卖出更高的价钱x,故而将top替换为(x,1),并将top.second换为2(暂定购买)再次入队。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long ll;
 5 typedef pair<ll, int> pi;
 6 const int N = 1e5+5;
 7 
 8 int main()
 9 {
10     int t, n, cnt;
11     ll ans, x;
12     for(scanf("%d", &t); t; t--){
13         scanf("%d", &n);
14         ans = cnt = 0;
15         priority_queue<pi, vector<pi>, greater<pi> > pq;
16         scanf("%lld", &x); pq.push(make_pair(x, 2));
17         while(--n){
18             scanf("%lld", &x);
19             pi top = pq.top();
20             if(x <= top.first) pq.push(make_pair(x, 2));
21             else{
22                 ans += x - top.first;
23                 if(top.second == 2) cnt += 2;
24                 pq.pop();
25                 if(top.second == 1) pq.push(make_pair(top.first, 2));
26                 pq.push(make_pair(x, 1));
27             }
28         }
29         printf("%lld %d\n", ans, cnt);
30     }
31     return 0;
32 }
View Code

比赛时读完题瞬间想到O(n^2)的大暴力,看到过题数不多就放弃了感觉大佬们一定是t了QAQ。。。

但是!!!赛后突然发现很简单???然后一顿乱写竟然也a了???明明1010也是写的O(n^2)的tledp还不换题简直是脑子瓦特了。。。

还一直和队友说这么多人tle1001肯定很难窝们看1003叭。。。

然而1003。。。费马小定理+群论。离散数学学那么渣。。。某虎直接跳过群论不讲啊当时。。。根本不可能做出来的好嘛。。。果然大佬的榜单跟不起。。。

posted on 2018-08-29 11:35  雪藤  阅读(122)  评论(0编辑  收藏  举报