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个不同的整数,使得第 ...
随机推荐
- js中push(),pop(),unshift(),shift()的用法
js中push(),pop(),unshift(),shift()的用法小结 1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及 ...
- C# 获取外网IP和运营商和城市
/// <summary> /// 获取客户端外网IP,省份,城市,运营商 /// 2012年12月18日 15:07 /// </summary> public class ...
- Working Experience - WPF 中 DataGrid 控件的应用
问题: 添加控件后, 编辑单元格会出现异常 绑定 ItemsSource 属性后, 更新绑定对象的数据, UI 不刷新 如何显示控件中 ComboBox 类型 解决方法: 绑定 ItemsSource ...
- Redis在windows实现将数据缓存起来定时更新读取
实现接口的读取存放在内存中,实现了Web网站直接读取内存数据,大大的减少了访问接口带来的等待时间,这个功能是比较实用的 需要下载一下‘类库’及‘Redis-x64-3.2.100程序包’ 百度云材料下 ...
- Swoole 多协议 多端口 的应用
目录 概述 网络通信协议设计 多端口监听的使用 小结 概述 这是关于 Swoole 学习的第五篇文章:Swoole 多协议 多端口 的应用. 第四篇:Swoole HTTP 的应用 第三篇:Swool ...
- codeforces 547B【单调栈】
题意: 有一个长度为n的序列,序列有长度为1...n的连续子序列, 一个连续子序列里面最小的值称作这个子序列的子序列的strength, 要求出每种长度的连续子序列的最大的strength. 思路: ...
- [UE4]C++设置AnimInstance的相关问题
注意:ue4 4.17调用LoadObject<UAnimBlueprintGeneratedClass>直接崩 http://aigo.iteye.com/blog/2285001 UA ...
- cf822C(贪心)
题目链接: http://codeforces.com/problemset/problem/822/C 题意: 有n条线段(n<=2e5) 每条线段有左端点li,右端点ri,价值cost(1 ...
- python 扩展注册功能装饰器举例
db_path='db.txt'def get_uname(): while True: uname=input('请输入用户名:').strip() if uname.isalpha(): with ...
- Angular.js思维导图
AngularJS的四大特性的思维导图如下: 将AngularJS应用于工作:其思维导图如下: AngularJS服务思维导图: