题目:
搜这个题的人 基本上都知道题 所以 题目大意略
思路:
在区间选择上的贪心算法
纵观整个题目 我们发现 当行的车确定后 它在列上是可以自由移动的,反之 易可 那么我们就可以得出一个结论:行和列是不相关的
所以 我们可以分开来求 先行后列 或 先列后行
怎么求?
我们可以先将右端点从小往大排序 如果右端点一样 就将左端点从小往大排,总之就是先满足 小区间 因为大区间包含小区间 所以无论 小区间怎么选 大区间总能选到
下方代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int INF=5100;
int n;
struct Node
{
int l;
int r;
int id;
} x[INF],y[INF];
int ansx[INF],ansy[INF];
bool f[INF];
bool c;
int cmp (Node a,Node b)
{
if(a.r==b.r)
return a.l<b.l;
return a.r<b.r;
}
int solve (Node a[INF],int ans[INF])
{
memset(f,true,sizeof(f));
sort(a+1,a+1+n,cmp);//右端点从小到大排序
/*for(int i=1;i<=n;i++)
{
cout<<a[i].l<<" "<<a[i].r<<endl;
}
cout<<endl;*/
int i;
for(i=1;i<=n;i++)
{
int j;
c=false;
for(j=a[i].l;j<=a[i].r;j++)
{
if(f[j])
{
f[j]=false;
ans[a[i].id]=j;
c=true;
break;
}
}
if(!c)
return false;
}
return true;
}
int main ()
{
cin>>n;
while(n)
{
for(int i=1;i<=n;i++)
{
cin>>x[i].l>>y[i].l>>x[i].r>>y[i].r;
x[i].id=y[i].id=i;
}
if(solve(x,ansx)&&solve(y,ansy))
{
for(int i=1;i<=n;i++)
{
cout<<ansx[i]<<" "<<ansy[i]<<endl;
}
}
else
cout<<"IMPOSSIBLE"<<endl;
cin>>n;
}
return 0;
}
end