1. 程式人生 > >[POJ3197]Stall Reservations (貪心)

[POJ3197]Stall Reservations (貪心)

題意

(來自洛谷)

約翰的N(l<N< 50000)頭奶牛實在是太難伺候了,她們甚至有自己獨特的產奶時段.當 然對於某一頭奶牛,她每天的產奶時段是固定的,為時間段A到B包括時間段A和時間段B.顯然,約翰必須開發一個調控系統來決定每頭奶牛應該被安排到哪個牛棚去擠 奶,因為奶牛們顯然不希望在擠奶時被其它奶牛看見.

約翰希望你幫他計算一下:如果要滿足奶牛們的要求,並且每天每頭奶牛都要被擠過奶,至少需要多少牛棚 •每頭牛應該在哪個牛棚被擠奶。如果有多種答案,你只需任意一種即可。

分析

一道比較經典的貪心題,整體還是很簡單的,只是我太菜。

個人感覺這道題是區間覆蓋的升級版?

就是要滿足所有的區間都被覆蓋,求開區間線(就是這題牛棚)的個數

我一開始是N2做的,但是50000的資料過不了

後面借鑑了一下李煜東的std

用小根堆做掉了

Code

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
#define N 50005
using namespace std;

int n,num;
struct COW {
    int l, r, id,ans;
    bool operator <(const COW x)
        
const { return l < x.l; } }cow[N]; int ans[N]; priority_queue<pair<int, int> > s; int main() { //freopen("testdata.in", "r", stdin); scanf("%d", &n); for (int i = 1; i <= n; i++) { cow[i].id = i; scanf("%d%d", &cow[i].l, &cow[i].r); } sort(cow
+ 1, cow + 1 + n); for (int i = 1; i <= n; i++) { int total = s.size(); if (total && -s.top().first < cow[i].l) { cow[i].ans = s.top().second; s.pop(); s.push(make_pair(-cow[i].r, cow[i].ans)); continue; } cow[i].ans = ++num; s.push(make_pair(-cow[i].r, num)); } printf("%d\n",s.size()); for (int i = 1; i <= n; i++) ans[cow[i].id] = cow[i].ans; for (int i = 1; i <= n; i++) printf("%d\n", ans[i]); return 0; }

PS:POJ炸了