1. 程式人生 > >【POJ 3190】 Stall Reservations

【POJ 3190】 Stall Reservations

ostream else exception RR pro pos \n main stack

【題目鏈接】

http://poj.org/problem?id=3190

【算法】

將這些牛按開始吃草的時間排序

維護一個數組S,Si表示畜欄i進去的最後一頭牛結束吃草的時間,對於每頭牛,找任意一個畜欄使得 Si < 這頭牛開始吃草時間,將這頭牛加入這個畜欄,如果不存在這樣的畜欄,則新建一個

這個過程可以用堆來加速

這個算法的正確性可以通過數學歸納法來證明 :

第1頭牛選畜欄 : 新建一個畜欄,顯然最優

假設前k頭牛選完了且是最優方案,那麽,輪到第(k+1)頭牛選時,找任意一個Si < 第(k+1)頭牛開始吃草時間的畜欄都是最優的,不會對後一頭牛產生任何影響,如果不存在這樣的畜欄,則新建一個,將第(k+1)頭牛放入,也是最優的

因此,最終求出的必然是最優解

【代碼】

#include <algorithm>  
#include <bitset>  
#include <cctype>  
#include <cerrno>  
#include <clocale>  
#include <cmath>  
#include <complex>  
#include <cstdio>  
#include <cstdlib>  
#include <cstring>  
#include 
<ctime> #include <deque> #include <exception> #include <fstream> #include <functional> #include <limits> #include <list> #include <map> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include
<istream> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stdexcept> #include <streambuf> #include <string> #include <utility> #include <vector> #include <cwchar> #include <cwctype> #include <stack> #include <limits.h> using namespace std; #define MAXN 50010 int i,n,tot,x,id,pos; int belong[MAXN]; priority_queue< pair<int,int> > q; struct info { int id,l,r; } a[MAXN]; inline bool cmp(info a,info b) { return a.l < b.l; } int main() { scanf("%d",&n); for (i = 1; i <= n; i++) { a[i].id = i; scanf("%d%d",&a[i].l,&a[i].r); } sort(a+1,a+n+1,cmp); belong[a[1].id] = 1; q.push(make_pair(-a[1].r,tot = 1)); for (i = 2; i <= n; i++) { x = -q.top().first; pos = q.top().second; if (a[i].l > x) { q.pop(); q.push(make_pair(-a[i].r,pos)); belong[a[i].id] = pos; } else { q.push(make_pair(-a[i].r,++tot)); belong[a[i].id] = tot; } } printf("%d\n",tot); for (i = 1; i <= n; i++) printf("%d\n",belong[i]); return 0; }

【POJ 3190】 Stall Reservations