这题主要学习了一下贪心的方法,和优先队列priority_queue的使用
贪心策略就是 每次 左边界 小的 并且 右边界 小的出队列,其次需要根据位置不断更新左边边界值
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<queue>
#include<set>
#include<vector>
#include<cmath>
using namespace std;
#define MAXD 5000 + 100
struct Car{
int l,r;
int ID;
friend bool operator < (Car p,Car q){
if(p.l != q.l){
if(p.l > q.l) return true;
else
return false;
}
else {
if(p.r > q.r) return true;
else
return false;
}
}
}car[MAXD];
int n;
int main(){
while(scanf("%d",&n) && n){
priority_queue<Car>q1;
priority_queue<Car>q2;
for(int i = 0 ; i < n ; i++){
Car temp1,temp2;
scanf("%d%d%d%d",&temp1.l,&temp2.l,&temp1.r,&temp2.r);
temp1.ID = i + 1; temp2.ID = i + 1;
q1.push(temp1);
q2.push(temp2);
}
int now_pos = 1;
int ok = 1;
int _x[MAXD],_y[MAXD];
while(!q1.empty()){
Car t = q1.top();
q1.pop();
if(t.l < now_pos){
t.l = now_pos;
q1.push(t);
}
else if(t.l > now_pos || t.r < now_pos){
ok = 0;
break;
}
else{
_x[now_pos++] = t.ID;
}
}
now_pos = 1;
if(ok)while(!q2.empty()){
Car t = q2.top();
q2.pop();
if(t.l < now_pos){
t.l = now_pos;
q2.push(t);
}
else if(t.l > now_pos || t.r < now_pos){
ok = 0;
break;
}
else{
_y[now_pos++] = t.ID;
}
}
int ans_x[MAXD],ans_y[MAXD];
for(int i = 1 ; i <= n ; i++){
int t = _x[i];
ans_x[t] = i;
for(int j = 1 ; j <= n ; j++)if(_y[j] == t){
ans_y[t] = j;
break;
}
}
if(ok) for(int i = 1 ; i <= n ; i++)
printf("%d %d\n",ans_x[i],ans_y[i]);
else
printf("IMPOSSIBLE\n");
}
return 0;
}