题意:要求在一个N*N的棋盘上放N个车,使得它们所在的行和列均不同,而且分别处于第 i 个矩形中。

解法:问题分解+贪心。

由于行、列不相关,所以可以先把行和列均不同的问题分解为2个“在区间[1,n]中选择n个不同的整数,使得第 i 个整数在[Li,Ri]内”的问题。

接下来的贪心很重要:先使区间R从小到大排序,再L。这样在每个合法区间段中尽量往左边选数的情况下,就能保证每个区间的右边一段是灵活合法的,而若R1=R2,由于是从左开始填数,这并不影响。反正我是没有找到反例的......而不像我( ′◔ ‸◔`)↓说到的一样。

其实呐,我的思考过程是介样的......想着先排序L,再R,直接筛掉每个区间右边与下一个开始重复的那段区间。结果先发现L1=L2时,由于也是从左开始填数,那么突然发现长度为1的区间很“危险”,[1,4]、[1,4]和[2,2]就不行了。(ಥ _ ಥ) 于是,应该赶紧转换一下思路了!就像有时从前往后贪心不行就从后往前贪心一样,改为先排序R,再L,这样子再试一些特殊数据就发现可以了。

╮(╯_╰)╭ 唉,关于代码,我不会用指针,便使代码长不少吧。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<algorithm>
5 #include<iostream>
6 using namespace std;
7 #define N 5010
8
9 int n;
10 int vis[N];
11 struct node{int l,r,id,t;}a[N],b[N];
12 int sx[N],sy[N];
13
14 bool cmp(node x,node y)
15 {
16 if (x.r!=y.r) return x.r<y.r;
17 return x.l<y.l;
18 }
19 bool solve()
20 {
21 sort(a+1,a+1+n,cmp),
22 memset(vis,0,sizeof(vis));
23 for (int i=1;i<=n;i++)
24 {
25 bool tf=false;
26 for (int j=a[i].l;j<=a[i].r;j++)
27 if (!vis[j])
28 {
29 a[i].t=j, vis[j]=1;
30 tf=true; break;
31 }
32 if (!tf) return tf;
33 }
34 sort(b+1,b+1+n,cmp),
35 memset(vis,0,sizeof(vis));
36 for (int i=1;i<=n;i++)
37 {
38 bool tf=false;
39 for (int j=b[i].l;j<=b[i].r;j++)
40 if (!vis[j])
41 {
42 b[i].t=j, vis[j]=1;
43 tf=true; break;
44 }
45 if (!tf) return tf;
46 }
47 return true;
48 }
49 int main()
50 {
51 while (1)
52 {
53 scanf("%d",&n);
54 if (!n) break;
55 for (int i=1;i<=n;i++)
56 {
57 scanf("%d%d%d%d",&a[i].l,&b[i].l,&a[i].r,&b[i].r);
58 a[i].id=b[i].id=i;
59 }
60 if (!solve()) {printf("IMPOSSIBLE\n");continue;}
61 for (int i=1;i<=n;i++)
62 sx[a[i].id]=a[i].t,sy[b[i].id]=b[i].t;
63 for (int i=1;i<=n;i++)
64 printf("%d %d\n",sx[i],sy[i]);
65 }
66 return 0;
67 }

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

  3. UVA 11134 Fabled Rooks 贪心

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

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

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

  5. UVa 11134 Fabled Rooks (贪心+问题分解)

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

  6. UVA - 11134 Fabled Rooks问题分解,贪心

    题目:点击打开题目链接 思路:为了满足所有的车不能相互攻击,就要保证所有的车不同行不同列,于是可以发现,行与列是无关的,因此题目可以拆解为两个一维问题,即在区间[1-n]之间选择n个不同的整数,使得第 ...

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

  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

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

随机推荐

  1. 【剑指 Offer】03.数组中重复的数字

    题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...

  2. Mac安装homebrew,postman,charles

    Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷. 1. ...

  3. 代码页(CodePage)列表

    代码页编号    国家地区或语言37                 IBM037    IBM EBCDIC (US-Canada)    437                 IBM437    ...

  4. Java编程开发之浅析Java引用机制

    对于一个Java的对象而言,存储主要分为两种,一种是内存堆(Heap),内存堆是无序的,主要用来存放创建的Java对象:一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程使用Java ...

  5. Py-解决粘包现象,tcp实现并发,tcp实现传输文件的程序,校验思路,线程与进程

    黏包现象 TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方TCP接收到 ...

  6. 夯实基础系列一:Java 基础总结

    前言 大学期间接触 Java 的时间也不短了,不论学习还是实习,都让我发觉基础的重要性.互联网发展太快了,各种框架各种技术更新迭代的速度非常快,可能你刚好掌握了一门技术的应用,它却已经走在淘汰的边缘了 ...

  7. C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    Twain 随着扫描仪.数码相机和其他图像采集设备的引入,用户热切地发现了将图像整合到他们的文档和其他工作中的价值.然而,支持这种光栅数据的显示和操作成本很高,应用程序开发人员需要创建用户界面并内置设 ...

  8. C#高级编程第11版 - 第二章 索引

    [1]2.1.1 Hello,World! 1. using static System.Console; // ... WriteLine("Hello World!"); 提前 ...

  9. 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy

    https://zh.wikipedia.org/wiki/反向代理 反向代理在计算机网络中是代理服务器的一种.服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后 ...

  10. 网易新闻App架构重构实践:DDD正走向流行

    网易新闻App架构重构实践:DDD正走向流行 https://mp.weixin.qq.com/s/FdwrT_xn3CQqpWoRVBttvQ 小智 InfoQ 2020-05-14 作者 | 小智 ...