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 }
比赛时读完题瞬间想到O(n^2)的大暴力,看到过题数不多就放弃了感觉大佬们一定是t了QAQ。。。
但是!!!赛后突然发现很简单???然后一顿乱写竟然也a了???明明1010也是写的O(n^2)的tledp还不换题简直是脑子瓦特了。。。
还一直和队友说这么多人tle1001肯定很难窝们看1003叭。。。
然而1003。。。费马小定理+群论。离散数学学那么渣。。。某虎直接跳过群论不讲啊当时。。。根本不可能做出来的好嘛。。。果然大佬的榜单跟不起。。。