POJ 3190 Stall Reservations (贪心、优先队列/set)

Stall Reservations
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 3384 Accepted: 1209 Special Judge

Description

Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows. 

Help FJ by determining:
  • The minimum number of stalls required in the barn so that each cow can have her private milking period
  • An assignment of cows to these stalls over time
Many answers are correct for each test dataset; a program will grade your answer.

Input

Line 1: A single integer, N 

Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.

Output

Line 1: The minimum number of stalls the barn must have. 

Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.

Sample Input

5
1 10
2 4
3 6
5 8
4 7

Sample Output

4
1
2
3
2
4

= = 首先本题的贪心思路很显然 以起始点排序 然后枚举就可以

如果后一个区间能接上 且起始点与上一个区间的结束点最近 那么就是 同一个Stall 反之则建立Stall

如何来实现呢  - - 对于10^4的数据O(n^2)的算法当然要TLE

那么我们可以使用set或者pq来维护这个区间结束点  每次取出最小的结束点就可以了(最小堆)

AC代码如下:

//
//  POJ 3190 Stall Reservations
//
//  Created by TaoSama on 2015-02-22
//  Copyright (c) 2015 TaoSama. All rights reserved.
//
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
#define CLR(x,y) memset(x, y, sizeof(x))

using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;

struct Cow {
	int l, r, id;
	bool operator<(const Cow& rhs) const {
		return r > rhs.r;
	}
} a[50005];
bool cmp(Cow x, Cow y) {
	return x.l < y.l;
}
int n, stall[50005];

int main() {
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	ios_base::sync_with_stdio(0);

	while(cin >> n) {
		priority_queue<Cow> pq;
		memset(stall, 0, sizeof stall);
		for(int i = 1; i <= n; ++i) {
			cin >> a[i].l >> a[i].r;
			a[i].id = i;
		}
		sort(a + 1, a + 1 + n, cmp);
		int ans = 1;
		stall[a[1].id] = 1; pq.push(a[1]);
		for(int i = 2; i <= n; ++i) {
			Cow t = pq.top();
			if(a[i].l > t.r) {
				stall[a[i].id] = stall[t.id];
				pq.pop();
			} else	stall[a[i].id] = ++ans;
			pq.push(a[i]);
		}
		cout << ans << endl;
		for(int i = 1; i <= n; ++i)
			cout << stall[i] << endl;
	}
	return 0;
}

用set维护:

//
//  POJ 3190 Stall Reservations
//
//  Created by TaoSama on 2015-02-22
//  Copyright (c) 2015 TaoSama. All rights reserved.
//
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
#define CLR(x,y) memset(x, y, sizeof(x))

using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;

struct Cow {
	int l, r, id;
	bool operator<(const Cow& rhs) const {
		return r < rhs.r;
	}
} a[50005];
bool cmp(Cow x, Cow y) {
	return x.l < y.l;
}
int n, stall[50005];
int main() {
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	ios_base::sync_with_stdio(0);

	while(cin >> n) {
		multiset<Cow> s;
		memset(stall, 0, sizeof stall);
		for(int i = 1; i <= n; ++i) {
			cin >> a[i].l >> a[i].r;
			a[i].id = i;
		}
		sort(a + 1, a + 1 + n, cmp);
		int ans = 1;
		stall[a[1].id] = 1; s.insert(a[1]);
		for(int i = 2; i <= n; i++) {
			Cow t = *s.begin();
			if(a[i].l > t.r) {
				s.erase(s.begin());
				stall[a[i].id] = stall[t.id];
			} else stall[a[i].id] = ++ans;
			s.insert(a[i]);
		}
		cout << ans << endl;
		for(int i = 1; i <= n; ++i)
			cout << stall[i] << endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值