您的位置:首页 > 其它

Uva 11134 问题分解,贪心策略区间选点问题

2016-10-06 17:56 399 查看
#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

//贪心策略:区间选点问题,vis保存在区间内已经选择的点,如果区间内不能选任何一个点,返回错误

//将第i个点的横坐标保存在a【】,纵坐标保存在b【】

const int maxn=5000+5;

int a[maxn],b[maxn],t;

struct node{

    int l,r,p;

    node():l(0),r(0),p(0){};

    bool operator <(const node&rhs)const {

        return r<rhs.r||(r==rhs.r&&l<rhs.l);

    }

}x[maxn],y[maxn];

//状态节点,区间节点

int solve(int*a1,node*x1){

    int vis[maxn];

    memset(vis,0,sizeof(vis));

    for(int i=0;i<t;i++){//遍历每个点找到相应的坐标位置

        for(int j=x1[i].l;j<=x1[i].r;j++){

            if(!vis[j]){//在区间x[i] 找最靠前的点如果该点没有被其他区域选中,则选中,区间选点问题,设置vis保存区间已经被占用的点

                a1[x1[i].p]=j;

                vis[j]=1;

                break;

            }

            if(j==x1[i].r)//如果区间内的最后一个点被占领,就无法选点

                return 0;

        }

    }

    return 1;

}

int main(){

    while(cin>>t&&t){

        for(int i=0;i<t;i++){

            cin>>x[i].l>>y[i].l>>x[i].r>>y[i].r;

            x[i].p=i;

            y[i].p=i;

        }

        sort(x,x+t);

        sort(y,y+t);

        if(solve(a,x)&&solve(b,y)){

            for(int i=0;i<t;i++){

                cout<<a[i]<<" "<<b[i]<<endl;

            }

        }

        else cout<<"IMPOSSIBLE"<<endl;

    }

    return 0;
}

//看似相关的x,y实际上不相关
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: