POJ:3190 Stall Reservations
题目链接:http://poj.org/problem?id=3190题意:贪心算法,将牛按照开始时间排序,栅栏按照结束时间排序,每次取结束时间最小的栅栏判断与当前牛的开始时间,假如小于,则取当前栅栏,否则新建栅栏,并且端点不重合注意:输出时按照输入牛的顺序输出#include <stdio.h>#include <iostream>#inc
·
题目链接: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;
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)