题目链接:uva 11134 - Fabled Rooks

题目大意:给出n,表示要在n*n的矩阵上放置n个车,并且保证第i辆车在第i个区间上,每个区间给出左上角和右小角的坐标。另要求任意两个车之间不能互相攻击。

解题思路:因为要保证说每两个车之间不能互相攻击,那么即任意行列都不能摆放两个以上的车,转而言之可以看成是将每一行或列分配给每辆车。如果行和列和起来考虑的话复杂度太高了,但是行和列的分配又互相不影响,所以可以分开讨论。

即对于一个区间[xl,xr],要分配一个x给它,做法和uva 1422一样。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <queue>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. const int N = 5005;
  9.  
  10. struct state {
  11. int l, r, id;
  12. friend bool operator < (const state a, const state b) {
  13. return a.r > b.r;
  14. }
  15. }x[N], y[N], ans[N];
  16. int n;
  17.  
  18. bool cmp(const state& a, const state& b) {
  19. return a.l < b.l;
  20. }
  21.  
  22. void init() {
  23. for (int i = 0; i < n; i++) {
  24. scanf("%d%d%d%d", &x[i].l, &y[i].l, &x[i].r, &y[i].r);
  25. x[i].id = y[i].id = i;
  26. }
  27. sort(x, x + n, cmp);
  28. sort(y, y + n, cmp);
  29. }
  30.  
  31. bool solve() {
  32. priority_queue<state> q;
  33. state c;
  34.  
  35. int p = 0;
  36. for (int i = 0; i < n; i++) {
  37. while(p < n) {
  38. if (x[p].l <= i + 1) q.push(x[p]);
  39. else break;
  40. p++;
  41. }
  42.  
  43. if (q.empty()) return false;
  44.  
  45. c = q.top(); q.pop();
  46. if (c.r < i + 1) return false;
  47. ans[c.id].l = i + 1;
  48. }
  49.  
  50. p = 0;
  51. for (int i = 0; i < n; i++) {
  52. while(p < n) {
  53. if (y[p].l <= i + 1) q.push(y[p]);
  54. else break;
  55. p++;
  56. }
  57.  
  58. if (q.empty()) return false;
  59.  
  60. c = q.top(); q.pop();
  61. if (c.r < i + 1) return false;
  62. ans[c.id].r = i + 1;
  63. }
  64.  
  65. for (int i = 0; i < n; i++) printf("%d %d\n", ans[i].l, ans[i].r);
  66. return true;
  67. }
  68.  
  69. int main () {
  70. while (scanf("%d", &n) == 1 && n) {
  71. init();
  72. if (solve() == false) printf("IMPOSSIBLE\n");
  73. }
  74. return 0;
  75. }

uva 11134 - Fabled Rooks(问题转换+优先队列)的更多相关文章

  1. 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 ...

  2. UVA 11134 Fabled Rooks 贪心

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

  3. UVA 11134 - Fabled Rooks(贪心+优先队列)

    We would like to place  n  rooks, 1 ≤  n  ≤ 5000, on a  n×n  board subject to the following restrict ...

  4. UVa 11134 - Fabled Rooks 优先队列,贪心 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  5. uva 11134 fabled rooks (贪心)——yhx

    We would like to place n rooks, 1 n 5000, on a n nboard subject to the following restrictions• The i ...

  6. UVA 11134 Fabled Rooks

    贪心+优先队列+问题分解 对x,y 分开处理 当 xl<cnt(当前处理行)时,不能简单的选择cnt,而是应该让xl=cnt 并重新加入优先队列.(y的处理同上) #include <io ...

  7. UVa 11134 - Fabled Rooks——[问题分解、贪心法]

    We would like to place n rooks, ≤ n ≤ , on a n × n board subject to the following restrictions • The ...

  8. UVa 11134 Fabled Rooks(贪心)

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

  9. UVA 11134 Fabled Rooks(贪心的妙用+memset误用警示)

    题目链接: https://cn.vjudge.net/problem/UVA-11134 /* 问题 输入棋盘的规模和车的数量n(1=<n<=5000),接着输入n辆车的所能在的矩阵的范 ...

随机推荐

  1. JAVA实现字符串反转,借助字符数组实现

    public static String reverseStr(String str) { int len = str.length(); char ch[] = str.toCharArray(); ...

  2. mysql 权限控制具体解释

    概述 mysql权限控制在不同的上下文和不同的操作水平上都能够进行控制,他们包括例如以下几个 ** 管理权限能够同意用户管理mysql server的操作. 这些权限控制是全局的,不是针对某个特定的数 ...

  3. 浅谈API设计

    为什么需要了解一些API设计? 只要你编程,你就是API Designer 一个好的设计,模块之间的耦合应该也是API级别的 一个程序,如果你独立开发,那你既是API的Designer,也是API的U ...

  4. SQL SERVER2012新分页方式 轉載

    SQL SERVER2012在ORDER BY 子句中加入了新元素offset,允许用户在排序完成的结果集中自定义输出行范围,大大简化了分页SQL的书写方式和效率. SQL SERVER2012在OR ...

  5. oracle 导入txt

    没有Oraclehoume的情况下,执行下环境变量文件 sqlldr userid= DM/DM control = /home/oracle/libc/load.ctl load data infi ...

  6. 代码风格——Cocos2d-x学习历程(四)

    1.Cocos2d-x拥有一个包含其他所有头文件的文件"cocos2d.h".通常,我们只需要在使用时包含这个头文件,就可以使用引擎的全部功能了. 2.Cocos2d-x的类都放置 ...

  7. python 发送安全邮件

    用python 写了一个发送邮件的脚本,配上host 和端口,发现一直报错: smtplib.SMTPException: No suitable authentication method foun ...

  8. C#进程管理程序实现

    运行效果图 部分代码如下: #region 打开应用程序按钮事件处理程序 /// <summary> /// 打开应用程序按钮事件处理程序 /// </summary> /// ...

  9. 微信平台BAE

    http://www.2cto.com/kf/201405/299487.html http://blog.csdn.net/lyq8479/article/details/26104667 http ...

  10. delphi 7 信息对话框的按钮屏蔽键盘操作,只允许鼠标点击

    本问题由 delphi 学友QQ群中一位群友提出,个人觉得是一个好问题. 本教程源码下载 本教程面向新手,希望大家能从中学到除了本功能之外的真正编程技能. 本功能的实现原理,用窗口当对话框的界面,在界 ...