UVA - 11134 Fabled Rooks 优先队列+贪心

题目大意:在n*n的棋盘上放置n个车,使得任意两辆车不互相攻击,且第i辆车在一个给定的矩形Ri之内

解题思路:每辆车都必须在给定矩形内放置且任意两辆不互相攻击,不互相攻击的话就表示任意两辆车不在同一行和同一列,这样的话,就分别按行和按列扫描,找到符合规则的就放

这里设置一个优先队列,因为要让所有的车都有位置放,就要考虑一下车的摆放顺序的。设第i辆车能摆放的区间为[si,di],则这里的优先规则就为:di小的先放


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 5010
struct node{
	int l1, l2, id;
	bool operator < (const node &t) const {
		if(t.l1 == l1)
			return l2 > t.l2;
		else
			return l1 > t.l1;
	}
}n1[maxn], n2[maxn];
int N, ans[maxn][2];
priority_queue<node> q;

bool check(node *arr, int pos) {
	int cur = 1;
	while(!q.empty())
		q.pop();
	for(int i = 0; i < N; i++)
		q.push(arr[i]);
	while(cur <= N) {
		node tmp = q.top();
		q.pop();
		if(tmp.l2 < cur)
			return false;
		if(tmp.l1 < cur) {
			tmp.l1 = cur;
			q.push(tmp);
			continue;	
		}
		if(tmp.l1 > cur) 
			return false;
		ans[tmp.id][pos] = cur++;
	}
	return true;
}

int main() {
	while(scanf("%d", &N) == 1 && N) {
		for(int i = 0; i < N; i++) {
			scanf("%d%d%d%d",&n1[i].l1, &n2[i].l1, &n1[i].l2, &n2[i].l2);
			n1[i].id = n2[i].id = i;
		}
		
		if(check(n1,0) && check(n2,1)) {
			for(int i = 0; i < N; i++)
				printf("%d %d\n",ans[i][0], ans[i][1]);	
		}
		else
			printf("IMPOSSIBLE\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值