链接:https://vjudge.net/problem/POJ-1456#author=shleodai
题意:
超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润.
每天只能卖一个商品.
现在你要让超市获得最大的利润.
(原题说明过于抽象)
思路:
贪心加并查集,先将所有物品以价格排序。
之后选物品时,先用并查集,往前查第一个没用过的天。
同时将使用的天合并。
代码:
#include <iostream>
#include <memory.h>
#include <string>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <map>
#include <queue>
#include <math.h>
using namespace std;
const int MAXN = 10000+10;
struct Node
{
int _value;
int _day;
bool operator < (const Node & that)const {
return this->_value > that._value;
}
}node[MAXN];
int Father[MAXN];
int Get_F(int x)
{
if (Father[x] == -1)
return x;
Father[x] = Get_F(Father[x]);
return Father[x];
}
int main()
{
int n;
while (cin >> n)
{
memset(Father,-1, sizeof(Father));
for (int i = 1;i<=n;i++)
cin >> node[i]._value >> node[i]._day;
sort(node+1,node+1+n);
/*
for (int i = 1;i<=n;i++)
cout << node[i]._value << ' ' << node[i]._day << endl;
*/
int sum = 0;
for (int i = 1;i<=n;i++)
{
int td = Get_F(node[i]._day);
if (td > 0)
{
sum += node[i]._value;
Father[td] = td-1;
}
}
cout << sum << endl;
}
return 0;
}