题意:你的任务是在n*n的棋盘上放 n 小于5000 个车 使得任意两个车不互相攻击 且第i个车在一个给定的矩形ri之内  给出该矩形左上角坐标和右下角坐标四个点  必须满足放车的位置在矩形内  边上也行  如果无解输出IMPSSIBLE

行与列是独立的   所以可以分割成两个一模一样的子问题   贪心

要以右边界升序排序   我一开始按照左边界排序错了   举个例子   1-1  1-3 2-2  这样的话就会错     1-1 2-2 1-3才对

还有就是注意细节  sort 从一开始的话 都要加一,,,

#include<bits/stdc++.h>
using namespace std;
#define N 5010
int n,k;
int vis[N];
struct node
{int id;int x,y;int x1,x2,y1,y2;}chess[N];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.id<b.id;}
int main()
{while(cin>>n,n){int flag=1;for(int i=0;i<n;i++){chess[i].id=i;scanf("%d%d%d%d",&chess[i].x1,&chess[i].y1,&chess[i].x2,&chess[i].y2);}sort(chess,chess+n,cmp1);memset(vis,0,sizeof vis);for(int i=0;i<n;i++){int ok=0;for(int j=chess[i].x1;j<=chess[i].x2;j++){if(!vis[j]){ok=1;vis[j]=1;chess[i].x=j;break; }//把chess里面的i写成了j  强行将自己dubug了半个小时。。。
            }if(!ok){flag=0;}}sort(chess,chess+n,cmp2);memset(vis,0,sizeof vis);for(int i=0;i<n;i++){int ok=0;for(int j=chess[i].y1;j<=chess[i].y2;j++){if(!vis[j]){ok=1;vis[j]=1;chess[i].y=j;break; }}if(!ok){flag=0;}}sort(chess,chess+n,cmp3);if(flag)for(int i=0;i<n;i++)printf("%d %d\n",chess[i].x,chess[i].y);else printf("IMPOSSIBLE\n");}
}

LRJ的代码  更慢

#include<cstdio>
#include<cstring>
#include <algorithm>
using namespace std;// solve 1-D problem: find c so that a[i] <= c[i] <= b[i] (0 <= i < n)
bool solve(int *a, int *b, int *c, int n) {fill(c, c+n, -1);for(int col = 1; col <= n; col++) {// find a rook with smalleset b that is not yet assignedint rook = -1, minb = n+1;for(int i = 0; i < n; i++)if(c[i] < 0 && b[i] < minb && col >= a[i]) { rook = i; minb = b[i]; }if(rook < 0 || col > minb) return false;c[rook] = col;}return true;
}const int maxn = 5000 + 5;
int n, x1[maxn], y1[maxn], x2[maxn], y2[maxn], x[maxn], y[maxn];int main() {while(scanf("%d", &n) == 1 && n) {for (int i = 0; i < n; i++)scanf("%d%d%d%d", &x1[i], &y1[i], &x2[i], &y2[i]);if(solve(x1, x2, x, n) && solve(y1, y2, y, n))for (int i = 0; i < n; i++) printf("%d %d\n", x[i], y[i]);elseprintf("IMPOSSIBLE\n");}return 0;
}

转载于:https://www.cnblogs.com/bxd123/p/10432674.html

8-4 Fabled Rooks uva11134相关推荐

  1. 解题报告 之 UVA11134 Fabled Rooks

    解题报告 之 UVA11134 Fabled Rooks Description Problem F: Fabled Rooks We would like to place n rooks, 1 ≤ ...

  2. UVa11134 - Fabled Rooks(贪心)

    11134 - Fabled Rooks We would like to place nn rooks, 1≤n≤50001 ≤ n ≤ 5000, on a n×nn × n board subj ...

  3. 11134 - Fabled Rooks

    Fabled Rooks We would like to place nn rooks, 1≤n≤50001 \le n \le 5000, on a n×nn \times n board sub ...

  4. UVa11134 Fabled Rooks(贪心算法)

    问题:在n*n的棋盘中,放置n个车,要求对应的车在规定的矩形区间范围内,并且n个车不在同一行或者列上. 思路: 从x,y方向上分别确认n个车的位置,以x方向为例.根据区间的右端从小到大排列.然后在对车 ...

  5. UVA11134 Fabled Rooks

    摘要: 贪心 链接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  6. UVA11134 传说中的车 Fabled Rooks

    首先,根据数据范围,可以得到这是一题O(N2) 考虑贪心 发现行和列是不相关的,于是可以把他们分成两个一维区间问题,也就是在线段中选出点使得每个线段中都有一个点,求出方案. 先考虑尽量不对后面造成影响 ...

  7. uva11134 -Fabled Rooks

    题意: 一个n*n的矩阵上放n个车,第i辆车在第i个区间上,每个区间给出左上角和右下角的坐标.任意两个车之间同行同列不能互相攻击,求这些车放置 的坐标. 思路: 第一眼看以为是N皇后的变形,后来发现车 ...

  8. uva 11134 Fabled Rooks

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

  9. UVA 11134 - Fabled Rooks(经典贪心)

    题目链接 https://cn.vjudge.net/problem/UVA-11134 [题意] 你的任务是在n×n的棋盘上放置n辆车,使得任意两辆车不互相攻击,且第i辆车在一个给定的矩形Ri以内. ...

最新文章

  1. 微信小程序textArea组件字数限制
  2. Java 8 Friday:让我们弃用那些旧版库
  3. 百家号 不被推荐,原因:将旧闻冒充新闻发布,请修改后重新发布
  4. java包裹邮费计算_GitHub - honghailiang/FreightSystem: 基于Java Swing编写的简易运费计算工具...
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院预约挂号系统
  6. aix 添加lv 大小
  7. 一步一步写算法(之图添加和删除)
  8. 进阶03 System、StringBuilder类
  9. android 不限速迅雷,安卓iOS,Windows和Mac四大系统迅雷不限速神器,今天全部解决了...
  10. 使用java实现MD5码算法
  11. 华为ME909s-821a开启LED状态指示灯
  12. 数据库学习(四)—SQL数据查询01(简单方法条件查询)
  13. 指数的增长和衰退问题
  14. 恢复Outlook 2010/2007已被删除邮件的方法
  15. 天平游码读数例题_天平游码怎么读数?
  16. Java EE结构理解 与Dao模式 no7.
  17. 如何轻松的破解excel 2016工作表密码
  18. VS2013 编译错误类型: 必须定义入口点
  19. GDPR从数据主体处收集信息时的信息提供,应包含哪些内容?怎样做才合规?
  20. UG编程编辑边倒圆技巧详细分享

热门文章

  1. Linux 命令之 rpmbuild -- 用于创建 rpm 格式的二进制软件包和源码软件包
  2. linux系统下安装jdk教程
  3. python的循环语句机制_Python-for循环的内部机制
  4. windows查看器无法打开图片_关于windows微软商城无法打开 错误代码0x80004003问题...
  5. python回归预测例子_案例实战 | 逻辑回归实现客户流失预测(附Python代码与源数据)...
  6. yxcms安装环境php,Windows7下PHP开发环境安装配置图文方法
  7. 用c语言产生大素数,C语言实现寻找大素数
  8. python读取sqlserver的数据_Python:使用并发未来进程P读取sqlserver数据
  9. ProtoBuff3.0.0在Ubuntu上安装
  10. 什么是RS232/RS485转换器?