摘要:贪心,问题分解。

因为行列无关,所以这个二维问题可以分解成两个一维问题。

优先队列实现:类似区间点覆盖的问题,先按照左端点排序,相同然后在按右端点排序(灵活性小的优先选)。最优的选法,当然是要使选的这个点经过的区间越少越好,那么就选最左边的点,因为选右边可能多经过区间,一定不比选最左边的更优。选完之后,就要把选过的点last忽略,并且把包含这个点的区间做修改,这个修改是动态的,可用优先队列

71ms

#include<bits/stdc++.h>
using namespace std; const int maxn = ;
struct seg
{
int l,r,id;
seg(int L,int R) { l = L; r = R; }
seg(){}
bool operator < (const seg& rhs) const {
return l > rhs.l || ( l == rhs.l && r > rhs.r);
}
}; seg dim[][maxn];
int rooks[maxn][]; priority_queue<seg> q; bool solve(int n,int d)
{
for(int i = ; i < n; i++){
q.push(dim[d][i]);
}
int last = ;
int id = ;
while(q.size()){
seg cur = q.top(); q.pop();
if(cur.l>cur.r) return false;
if(cur.l<=last) {
cur.l = last + ; q.push(cur);
}else {
last = cur.l;
rooks[cur.id][d] = cur.l;
}
}
return true;
} int main()
{
//freopen("in.txt","r",stdin);
int n;
seg *R = dim[], *C = dim[];
for(int i = ; i < maxn; i++) dim[][i].id = dim[][i].id = i;
while(~scanf("%d",&n)&&n){
for(int i = ; i < n; i++){
scanf("%d%d%d%d",&R[i].l,&C[i].l,&R[i].r,&C[i].r);
}
if(solve(n,)&&solve(n,)){
for(int i = ; i < n; i++){
printf("%d %d\n",rooks[i][],rooks[i][]);
}
}else puts("IMPOSSIBLE"); }
return ;
}

优先队列

另外一种贪心,直接按照右端点排序,优先处理右端点最小的区间,因为它的灵活性最小。从左往右边选点,使当前点尽量避免经过没有选点的区间。

这样做的效率要更高

11ms

#include<bits/stdc++.h>
using namespace std; const int maxn = ;
struct seg
{
int l,r,id;
bool operator < (const seg& rhs) const {
return r < rhs.r ;
}
}; seg dim[][maxn];
int rooks[maxn][]; bool solve(int n,int d)
{
int last = -;
seg *Dim = dim[d];
bool vis[n+];
memset(vis,,sizeof(vis));
sort(Dim,Dim+n);
for(int i = ; i < n; i++){
int j;
for(j = Dim[i].l; j <= Dim[i].r; j++) if(!vis[j]) {
rooks[Dim[i].id][d] = j; vis[j] = true; break;
}
if(j>Dim[i].r) return false;
}
return true;
} int main()
{
int n;
seg *R = dim[], *C = dim[];
while(~scanf("%d",&n)&&n){
for(int i = ; i < n; i++){
scanf("%d%d%d%d",&R[i].l,&C[i].l,&R[i].r,&C[i].r);
R[i].id = C[i].id = i;
}
if(solve(n,)&&solve(n,)){
for(int i = ; i < n; i++){
printf("%d %d\n",rooks[i][],rooks[i][]);
}
}else puts("IMPOSSIBLE"); }
return ;
}

右端排序

UVA 11134 FabledRooks 传说中的车 (问题分解)的更多相关文章

  1. UVa 11134 Fabled Rooks (贪心+问题分解)

    题意:在一个n*n的棋盘上放n个车,让它们不互相攻击,并且第i辆车在给定的小矩形内. 析:说实话,一看这个题真是没思路,后来看了分析,原来这个列和行是没有任何关系的,我们可以分开看, 把它变成两个一维 ...

  2. 01_传说中的车(Fabled Rooks UVa 11134 贪心问题)

    问题来源:刘汝佳<算法竞赛入门经典--训练指南> P81: 问题描述:你的任务是在n*n(1<=n<=5000)的棋盘上放n辆车,使得任意两辆车不相互攻击,且第i辆车在一个给定 ...

  3. UVA - 11134 Fabled Rooks[贪心 问题分解]

    UVA - 11134 Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n × n board subject to t ...

  4. uva 11134 - Fabled Rooks(问题转换+优先队列)

    题目链接:uva 11134 - Fabled Rooks 题目大意:给出n,表示要在n*n的矩阵上放置n个车,并且保证第i辆车在第i个区间上,每个区间给出左上角和右小角的坐标.另要求任意两个车之间不 ...

  5. UVA 11134 Fabled Rooks 贪心

    题目链接:UVA - 11134 题意描述:在一个n*n(1<=n<=5000)的棋盘上放置n个车,每个车都只能在给定的一个矩形里放置,使其n个车两两不在同一行和同一列,判断并给出解决方案 ...

  6. UVA - 11134 Fabled Rooks(传说中的车)(贪心)

    题意:在n*n的棋盘上放n个车,使得任意两个车不相互攻击,且第i个车在一个给定的矩形Ri之内,不相互攻击是指不同行不同列,无解输出IMPOSSIBLE,否则分别输出第1,2,……,n个车的坐标. 分析 ...

  7. UVa 11134 传说中的车

    https://vjudge.net/problem/UVA-11134 题意:在n*n的棋盘上放n个车,使得任意两个车不相互攻击,且第i个车在一个给定的矩形Ri之内.用4个整数xli,yli,xri ...

  8. 【uva 11134】Fabled Rooks(算法效率--问题分解+贪心)

    题意:要求在一个N*N的棋盘上放N个车,使得它们所在的行和列均不同,而且分别处于第 i 个矩形中. 解法:问题分解+贪心. 由于行.列不相关,所以可以先把行和列均不同的问题分解为2个"在区间 ...

  9. UVA - 11134 Fabled Rooks问题分解,贪心

    题目:点击打开题目链接 思路:为了满足所有的车不能相互攻击,就要保证所有的车不同行不同列,于是可以发现,行与列是无关的,因此题目可以拆解为两个一维问题,即在区间[1-n]之间选择n个不同的整数,使得第 ...

随机推荐

  1. Matcher的group()/group(int group)/groupCount()用法介绍

    直接上代码: package com.dajiangtai.djt_spider.util; import java.util.regex.Matcher;import java.util.regex ...

  2. nodebrew的安装与使用

    创建: 2019/05/10  安装 brew install nodebrew 初始化 nodebrew setup ~/.bash_profile 里添加 export PATH=/usr/loc ...

  3. MySQL学习中,遇到的问题记录

    一.安装mysql时,报错:1045 原因:因为之前安装过mysql,之后再安装会出现这个问题. 解决: 删除之前的残留就好了 方法:清除mysql之前的历史残留

  4. js中的原型以及原型链

    在js中原型是每个构造函数的属性: 这个算 js 核心概念的一部分 var f1 = new Foo(); 对象 f1 的构造函数就是 Foo , f1的原型 __proto__ 就指向构造函数 Fo ...

  5. mysql5.7日志时间戳(log_timestmaps)与系统时间不一致问题以及日志报Got an error reading communication packets情况分析

    一.mysql安装后error_log日志时间戳默认为UTC(如下图),因此会造成与系统时间不一致,与北京时间相差8个小时. 解决errro_logs时间戳与linux系统时间不一致问题 step1: ...

  6. Codeforces Round #563 (Div. 2) A. Ehab Fails to Be Thanos

    链接:https://codeforces.com/contest/1174/problem/A 题意: You're given an array aa of length 2n2n. Is it ...

  7. 详解window.history

    http://blog.csdn.net/woxueliuyun/article/details/51075272

  8. mirror与repository的关系

    mirror与repository的关系 mirror管理的两个repository的关系,本来是访问repoA, 但是repoB mirrorOf repoA, 就会去repoB上去找. https ...

  9. 爬虫(Xpath)——爬tieba.baidu.com

    工具:python3 核心知识点: 1)lxml包不能用pip下载,因为里面有其他语言编写的文件 2)urlopen返回的请求是html文件,要使用 content = etree.HTML(html ...

  10. k8s的nfs存储外挂设置过程

    需求: 在k8s集群里的某个模块生成的目录文件或者更新的目录文件,存储到外面某台服务器上 1.安装nfs服务(192.168.1.2  Ubuntu 16.04) apt-get install nf ...