摘要:贪心,问题分解。

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

优先队列实现:类似区间点覆盖的问题,先按照左端点排序,相同然后在按右端点排序(灵活性小的优先选)。最优的选法,当然是要使选的这个点经过的区间越少越好,那么就选最左边的点,因为选右边可能多经过区间,一定不比选最左边的更优。选完之后,就要把选过的点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. 微信小程序开发之下拉菜单

    实现功能:点击维保人员,调出下拉菜单.选择子菜单时,显示右边的图标表示选中,并进行赋值并进行搜索筛选 Wxml: <view class="dtclass" bindtap= ...

  2. Linux 之问题集锦(一)

    1. 打开目录时,怎么只显示一个窗口 计算机 -- 编辑 -- 首选项 -- 行为 -- 总是总浏览器窗口中打开 2. linux中添加PATH时出现 Found a swap file by the ...

  3. 洛谷 - P1063 - 能量项链 - 区间dp

    https://www.luogu.org/problemnew/show/P1063 这个并不是每次只能从两边扩展的,可以从中间断开. #include<bits/stdc++.h> u ...

  4. header元素 footer元素 hgroup元素

    header元素 header元素是一种具有引航和导航作用的结构元素, 通常用来放置整个页面或页面内的一个内容区块的标题, 但是也可以包含其他内容, 例如数据表格,搜索表单, 或相关的logo图片 h ...

  5. oracle数据库之分组查询(转)

    本章内容和大家分享的是数据当中的分组查询.分组查询复杂一点的是建立在多张表的查询的基础之上,(我们在上一节课的学习中已经给大家分享了多表查询的使用技巧,大家可以自行访问:多表查询1  多表查询2)而在 ...

  6. 最短路(floyd/dijkstra/bellmanford/spaf 模板)

    floyd/dijkstra/bellmanford/spaf 模板: 1. floyd(不能处理负权环,时间复杂度为O(n^3), 空间复杂度为O(n^2)) floyd算法的本质是dp,用dp[k ...

  7. codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】

    容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2<=n则有解,否则无解 然后剩下的情况最 ...

  8. IT 面试题

    1.JDK1.X新增的功能   ==>>> 2.字符流和字节流的区别,使用场景,相关类   ==>>> 字节流与字符流 在Java.io包中操作文件内容的主要有两大 ...

  9. 爬虫之scapy

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  10. JS高级学习历程-14

    昨天内容回顾 1. 面向对象的私有成员.静态成员 私有成员:在构造函数里边定义局部变量,就是私有成员. 静态成员:在js里边,函数就是对象,可以通过给函数对象声明成员方式声明静态成员. 2. 原型继承 ...