UVa 11134 (区间上的贪心) Fabled Rooks

时间:2022-10-04 03:59:42

这道题真是WA得我心力交瘁,好讨厌的感觉啊!

简直木有写题解的心情了

题意:

n×n的棋盘里,放置n个车,使得任意两车不同行且不同列,且第i个车必须放在给定的第i个矩形范围内。输出一种方案,即每个车的坐标,无解的话则输出“IMPOSSIBLE”

行和列是独立的,所以可以分开处理,将二维的转化成了一维区间上的取点问题:

有一个长度为n的区间,还有n个小区间,求一种方案,在每个小区间的范围取一个点,是的大区间上每个单位1的区间里都有点。

开始写的贪心是错误的:

按区间的左端点从小到大排序,然后右端点从小到大二级排序。

这里有个反例:

比如按这种方式排序后的区间是:[1, 3] [1, 3] [2, 2]

那么第一第二个点会放在前两个[1, 3]里面,而第三个点就放不下了。

但是显然这种情况是有合法方案的。

正确的贪心方式:

先对区间的右端点从小到大排序,然后左端点从大到小二级排序(满足区间短的先选)。

从区间的角度考虑:

然后对于每个区间,在它所覆盖的范围从左到右遍历,如果没有放点,就放进去。如果遍历完整个区间都没有点能放,就说明不存在合法方案。

从点考虑的话,我又WA掉了。。=_=||

将区间排序后,从第一个点开始,找到第一个能放进去的区间就放下。

下面是AC的代码君:

 //#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
struct Node
{
int x1, x2, y1, y2;
int x, y;
int order;
}a[maxn];
int n;
bool vis[maxn]; bool cmp1(Node a, Node b)
{
return a.x2 < b.x2 || (a.x2 == b.x2 && a.x1 > b.x1);
} bool cmp2(Node a, Node b)
{
return a.y2 < b.y2 || (a.y2 == b.y2 && a.y1 > b.y1);
} bool cmp3(Node a, Node b)
{
return a.order < b.order;
} int main(void)
{
#ifdef LOCAL
freopen("11134in.txt", "r", stdin);
#endif while(scanf("%d", &n) == && n)
{
for(int i = ; i < n; ++i)
{
scanf("%d%d%d%d", &a[i].x1, &a[i].y1, &a[i].x2, &a[i].y2);
a[i].order = i;
} memset(vis, false, sizeof(vis));
flag = true;
sort(a, a + n, cmp1);
for(int i = ; i < n; ++i)
{
for(j = a[i].x1; j <= a[i].x2; ++j)
{
if(!vis[j])
{
vis[j] = true;
a[i].x = j;
break;
}
}
if(j > a[i].x2)
{
flag = false;
break;
}
} if(flag)
{
memset(vis, false, sizeof(vis));
sort(a, a + n, cmp2);
for(int i = ; i < n; ++i)
{
for(j = a[i].y1; j <= a[i].y2; ++j)
{
if(!vis[j])
{
vis[j] = true;
a[i].y = j;
break;
}
if(j > a[i].y2)
{
flag = false;
break;
}
}
}
} if(flag)
{
sort(a, a + n, cmp3);
for(int i = ; i < n; ++i) printf("%d %d\n", a[i].x, a[i].y);
}
else
puts("IMPOSSIBLE");
} return ;
}

代码君

UVa 11134 (区间上的贪心) Fabled Rooks的更多相关文章

  1. nyoj891&lpar;区间上的贪心&rpar;

    题目意思: 给一些闭区间,求最少须要多少点,使得每一个区间至少一个点. http://acm.nyist.net/JudgeOnline/problem.php?pid=891 例子输入 4 1 5 ...

  2. 紫书 例题8-4 UVa 11134(问题分解 &plus; 贪心)

     这道题目可以把问题分解, 因为x坐标和y坐标的答案之间没有联系, 所以可以单独求两个坐标的答案 我一开始想的是按照左区间从小到大, 相同的时候从右区间从小到大排序, 然后WA 去uDebug找了数据 ...

  3. 01&lowbar;传说中的车&lpar;Fabled Rooks UVa 11134 贪心问题&rpar;

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

  4. UVA - 11134 Fabled Rooks&lbrack;贪心 问题分解&rsqb;

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

  5. UVa 11134 Fabled Rooks(贪心)

    题目链接  题意  在n*n的棋盘上的n个指定区间上各放1个'车’ , 使他们相互不攻击(不在同行或同列),输出一种可能的方法. 分析 每行每列都必须放车,把行列分开看,若行和列同时有解,则问题有解. ...

  6. UVa 11134 Fabled Rooks (贪心&plus;问题分解)

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

  7. UVA 11134 Fabled Rooks 贪心

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

  8. uva 11134 - Fabled Rooks&lpar;问题转换&plus;优先队列)

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

  9. 贪心 uvaoj 11134 Fabled Rooks

    Problem F: Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the ...

随机推荐

  1. 安装使用Oracle OSWbb&sol;OSWbba工具

    OSWbb是收集数据,OSWbba 是分析数据,在OSWbb4.0以后,OSWbba已经绑定在OSWbb内. 1.创建目录,上传/解压安装包 [oracle@std ~]$ mkdir oswbb [ ...

  2. iOS两个框架之间的类型转换--&quot&semi;桥接&quot&semi;技术

    话不多说,直接举例说明吧.场景模拟:需要开发一个通讯录相关功能,实现访问以及添加等等.这时,需要使用的框架是Core Foundation.而此框架使用的是C语言,例如:CFArrayRef,CFSt ...

  3. P1965 转圈游戏

    很容易可以得到,答案应该是(x+m*10^k)%n 很显然,用O(n)一定会卡爆,所以用快速幂来算,或者找一下循环节也是可以的. #include <bits/stdc++.h> usin ...

  4. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(一)

    本文转载自 http://blog.csdn.net/cutesource/article/details/6192016 如何正确使用NIO来构架网络服务器一直是最近思考的一个问题,于是乎分析了一下 ...

  5. linux find 反转 查找没有被找到的结果

    在linux下,有时候需要找一些文件,还有时候这些文件格式不够统一和规范,但是需要排除的那些文件却格式统一,就可以使用find命令的反转功能 一般用find查找文件的命令是: find . -name ...

  6. 解决html代码文本复制问题,js技术

    实例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <scr ...

  7. &lpar;1&rpar;构造方法和方法重载 &lpar;2&rpar;this关键字 &lpar;3&rpar;方法的传参和递归调用

    1.构造方法和方法重载如: Person p = new Person(); - 声明Person类型的引用p指向Person类型的对象 p.show(); - 调用名字为show()的成员方法 1. ...

  8. python中decorator的用法及原理(一)

    0. 概念 什么叫装饰器,其实也可以叫做包装器.即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来. Python中的装饰器分为两类:函数装饰器和类 ...

  9. Moodle的安装和登陆(使用Https)

    之前使用默认的配置和安装,到中间检测组件是,总是提示  site no https.所以重新安装,用:https://localhost来登陆,结果不再提示,所以建议大家在使用时,还是用https来登 ...

  10. Mysql 不存在则插入&comma;存在则更新

    )) BEGIN ) ; END 开始写了一大堆的代码来实现,原来还有这种方法,惊讶~~~ 如果不存在,就插入一条数据:如果存在,更新某个字段. on duplicate key update: my ...