HDU 6438 Buy and Resell 【思维】【贪心】

题目大意:

现在有n个城市,你依次经过城市$1$ ~ $n$。每个城市都有一个共同的物品,但它们的价格可能会不一样。你经过一个城市时可以选择将这个物品以 $a_i$ 的价格买下来,或者是以 $a_i$的价格卖出去(卖出去的前提是你已经有至少一个此物品),每个城市最多进行一次买/卖操作。
初始时你又无限多的钱,问在走完这n个城市后你的钱最多能变成多少,并输出此时交易的次数。当能通过多种买/卖的方法达到最多钱的时候,输出交易次数最少的那一次。

解题思路:

我们可以用一个可以自动排好序的容器存储当前可以买到哪些货,排序是按照最便宜的在前面这样,每次到了可以卖的时候就先卖掉,然后到一个可以赚更多钱的城市的时候,再收回,重新卖一遍。
每个输入的x存两次是一次代表着买入一次代表着卖出。当买入时说明一定在最后卖出了,这时买卖次数++。

Mycode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
using namespace std;

long long res;
int t, n, cnt, x;
pair<int, int> pp;
multiset< pair<int, int> > Q;

int main()
{
scanf("%d", &t);
while(t--)
{
Q.clear();
res = cnt = 0;
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
scanf("%d", &x);
Q.insert(make_pair(x, 1)); //sell
Q.insert(make_pair(x, 2)); //buy
pp = *Q.begin();
res += x - pp.first;
if(!(pp.second & 1))
++cnt;
Q.erase(Q.begin());
}
printf("%lld %d\n", res, cnt << 1);
}
return 0;
}
Donate comment here
0%