题目链接:http://poj.org/problem?id=3190


题意:贪心算法,将牛按照开始时间排序,栅栏按照结束时间排序,每次取结束时间最小的栅栏判断与当前牛的开始时间,假如小于,则取当前栅栏,否则新建栅栏,并且端点不重合

注意:输出时按照输入牛的顺序输出

#include <stdio.h>
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
struct point {
    int start,end,number,in_order,out_order;
    point(){
        
    }
    point (int io,int a,int b,int n){
        in_order=io;
        start=a;
        end=b;
        number=n;
    }
    friend bool operator <(point a,point b){
        return a.end>b.end;
    }
};
bool compare(point a,point b){
    return a.start<b.start;
}
bool compare2(point a,point b){
    return a.in_order<b.in_order;
}
priority_queue<point> all;
point set[50005];
int main(){
    int n;
    cin>>n;
    int a,b;
    for(int i=0;i<n;i++){
        cin>>a>>b;
        point tmp(i,a,b,0);
        set[i]=tmp;
    }
    sort(set,set+n,compare);
    int size=1;
    all.push(point(0,set[0].start,set[0].end,1));
    set[0].out_order=1;
    for(int i=1;i<n;i++){
        point tmp=all.top();
        if(tmp.end<set[i].start){//与当前结束最短的栅栏比较
            all.pop();
            all.push(point(0,set[i].start,set[i].end,tmp.number));
            set[i].out_order=tmp.number;
        }else{
            size++;
            all.push(point(0,set[i].start,set[i].end,size));
            set[i].out_order=size;
        }
    }
    cout<<size<<endl;
    sort(set,set+n,compare2);//按照输入顺序排序
    for(int i=0;i<n;i++){
        cout<<set[i].out_order<<endl;
    }
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐