poj 3190

来源:互联网 发布:新纪元取数软件 编辑:程序博客网 时间:2024/06/06 01:30

仍然是区间的贪心问题。
贪心策略是这样的:我们首先将所有的牛按照区间A-B的A从小到大排序,然后用优先队列维护这个区间,排列规则是按照B从小到大排序,对于第i头牛,如果它的A大于此时最小的B,那么说明它们可以在同一个牛棚,它们的编号就是相同的。否则,就新开一个牛棚。

#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>#include<set>#include<bitset>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,num) scanf("%d%d%d",&a,&b,&num)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))#define ll __int64const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;//#pragma comment(linker,"/STACK:1024000000,1024000000")int n;#define M 110#define N 1000010#define Mod 258280327#define p(x,y) make_pair(x,y)const int MAX_len=550;struct Node{    int id;    int l,r;    bool operator <(const Node &x)const{        return r>x.r;   //按照r从小到大的规则使用优先队列    }}a[50010];bool cmp(Node x,Node y){    return x.l<y.l;}int res[50010];int main(){#ifndef ONLINE_JUDGE    freopen("in.txt", "r", stdin);//  freopen("out.txt", "w", stdout);#endif    while(sf(n)!=EOF){        for(int i=0;i<n;i++){            a[i].id = i;            sfd(a[i].l,a[i].r);        }        sort(a,a+n,cmp);        memset(res,0,sizeof res);        int num=0;        res[a[0].id] = ++num;        priority_queue<Node> q;        q.push(a[0]);        for(int i=1;i<n;i++){            Node tmp = q.top(); //tmp是当前r最小的            if(tmp.r<a[i].l){   //如果a[i]的左边界大于最小的r,那么它们就可以并在一起                res[a[i].id] = res[tmp.id]; //并在一起,所以它们的编号是一样的                q.pop();                q.push(a[i]);            }else{      //否则的话就新使用一个stall                res[a[i].id] = ++num;                q.push(a[i]);            }        }        pf(num);        for(int i=0;i<n;i++)            printf("%d\n",res[i]);    }    return 0;}
0 0
原创粉丝点击