UVA 11134 FabledRooks 传说中的车 (问题分解)
摘要:贪心,问题分解。
因为行列无关,所以这个二维问题可以分解成两个一维问题。
优先队列实现:类似区间点覆盖的问题,先按照左端点排序,相同然后在按右端点排序(灵活性小的优先选)。最优的选法,当然是要使选的这个点经过的区间越少越好,那么就选最左边的点,因为选右边可能多经过区间,一定不比选最左边的更优。选完之后,就要把选过的点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 传说中的车 (问题分解)的更多相关文章
- UVa 11134 Fabled Rooks (贪心+问题分解)
题意:在一个n*n的棋盘上放n个车,让它们不互相攻击,并且第i辆车在给定的小矩形内. 析:说实话,一看这个题真是没思路,后来看了分析,原来这个列和行是没有任何关系的,我们可以分开看, 把它变成两个一维 ...
- 01_传说中的车(Fabled Rooks UVa 11134 贪心问题)
问题来源:刘汝佳<算法竞赛入门经典--训练指南> P81: 问题描述:你的任务是在n*n(1<=n<=5000)的棋盘上放n辆车,使得任意两辆车不相互攻击,且第i辆车在一个给定 ...
- 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 ...
- uva 11134 - Fabled Rooks(问题转换+优先队列)
题目链接:uva 11134 - Fabled Rooks 题目大意:给出n,表示要在n*n的矩阵上放置n个车,并且保证第i辆车在第i个区间上,每个区间给出左上角和右小角的坐标.另要求任意两个车之间不 ...
- UVA 11134 Fabled Rooks 贪心
题目链接:UVA - 11134 题意描述:在一个n*n(1<=n<=5000)的棋盘上放置n个车,每个车都只能在给定的一个矩形里放置,使其n个车两两不在同一行和同一列,判断并给出解决方案 ...
- UVA - 11134 Fabled Rooks(传说中的车)(贪心)
题意:在n*n的棋盘上放n个车,使得任意两个车不相互攻击,且第i个车在一个给定的矩形Ri之内,不相互攻击是指不同行不同列,无解输出IMPOSSIBLE,否则分别输出第1,2,……,n个车的坐标. 分析 ...
- UVa 11134 传说中的车
https://vjudge.net/problem/UVA-11134 题意:在n*n的棋盘上放n个车,使得任意两个车不相互攻击,且第i个车在一个给定的矩形Ri之内.用4个整数xli,yli,xri ...
- 【uva 11134】Fabled Rooks(算法效率--问题分解+贪心)
题意:要求在一个N*N的棋盘上放N个车,使得它们所在的行和列均不同,而且分别处于第 i 个矩形中. 解法:问题分解+贪心. 由于行.列不相关,所以可以先把行和列均不同的问题分解为2个"在区间 ...
- UVA - 11134 Fabled Rooks问题分解,贪心
题目:点击打开题目链接 思路:为了满足所有的车不能相互攻击,就要保证所有的车不同行不同列,于是可以发现,行与列是无关的,因此题目可以拆解为两个一维问题,即在区间[1-n]之间选择n个不同的整数,使得第 ...
随机推荐
- dialog 设置maxHeight 最大高度
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Displ ...
- \n和\r\n的区别
\r是回车符,\n是换行符计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好 ...
- Keras输出每一层网络大小
示例代码: model = Model(inputs=self.inpt, outputs=self.net) model.compile(loss='categorical_crossentropy ...
- js 实现发布订阅模式
/* Pubsub */ function Pubsub(){ //存放事件和对应的处理方法 this.handles = {}; } Pubsub.prototype = { //传入事件类型typ ...
- 解决eclipse js文件报错(转)
在我们将项目导入Eclipse后,配置好各种编译条件.加载好jar包.配置好tomcat后发现项目还是报错,(前提是项目本身并没有错误,而是我们在初次导入到Eclipse中的时候报错),那是什么原因引 ...
- ps色彩混合
http://tieba.baidu.com/p/2032536851?pn=1 HSB 这是一种颜色的表示方法:其中"H"表示色相,"S"表示饱和度,&quo ...
- hadoop是什么?新手自学hadoop教程【附】大数据系统学习教程
Hadoop是一个由Apache基金会所开发的分布式系统基础架构. Hadoop是一个专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式. Hadoop=HDFS(文件 ...
- left join on 和where条件的放置(转)
http://blog.csdn.net/muxiaoshan/article/details/7617533
- 3.过滤数据 ---SQL
一.使用WHERE子句 SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49; 输出▼ prod_name prod_p ...
- MySQL创建用户+授权+备份
======权限管理====== 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.update.grant等操作. 那么一般情况在公司 ...