POJ 1456 Supermarket (贪心枚举 + 并查集)

POJ 1456 Supermarket (贪心枚举 + 并查集)

vj链接

Solution

(暴力)按权值从大到小排序,从结束日期开始往前枚举判断是否能安排。
(并查集优化)待补。

代码

#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
//#define int long long
#define lowbit(x) ((x) & (-x))
using namespace std;
typedef pair<int, int> pii;
typedef pair<long, long> pll;
typedef pair<double, int> pdi;
typedef double dd;
typedef long long ll;
const int MAXN = 10010;
const int MAXM = 3000010;
const dd eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;

int n, fa[MAXN];
pii a[MAXN];

int fd(int x){
	return x == fa[x] ? x : (fa[x] = fd(fa[x]));
}
int main()
{
	while (cin >> n)
	{
		if(n == 0)
		{
			printf("0\n");
			continue;
		}
		for (int i = 1; i <= 10004;i++)
			fa[i] = i;
		for (int i = 1; i <= n; i++)
			cin >> a[i].first >> a[i].second;
		sort(a + 1, a + 1 + n, greater<pii>());
		int sum = a[1].first;
		for (int i = 2; i <= n;i++)
		{
			for (int j = a[i].second; j >= 1;j--)
			{
				if (fd(j) != fd(a[1].second))
				{
					fa[fd(j)] = fd(a[1].second);
					sum += a[i].first;
					break;
				}
			}
		}
		printf("%d\n", sum);
	}
}

版权声明:本文为weixin_53177273原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。