题意:要求在一个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. Maven 中 install,package,deploy命令区别

    mvn clean package依次执行了clean.resources.compile.testResources.testCompile.test.jar(打包)等7个命令. mvn clean ...

  2. SQL注入之堆叠注入(堆查询注入)

    Stached injection -- 堆叠注入 0x00 堆叠注入的定义 ​ Stacked injection 汉语翻译过来后,称 为堆查询注入,也有称之为堆叠注入.堆叠注入为攻击者提供了很多的 ...

  3. java之环境配置

    前言:本人环境 Windows10(64位),jdk1.8.131 开发工具: IDEA 第一步: 获取JDK 方法一:推荐官网(此方法需要oracle账号,可以免费注册)   方法二:百度网盘(需要 ...

  4. RabbitMQ常用的几种消息模型

    第一种模型(HelloWorld) 上图来自官方文档 P代表生产者用来生产消息,发送给消费者C,中间的共色部分代表消息队列,用来缓存消息. 首先导入依赖 <dependency> < ...

  5. QA职责

  6. Java开发手册之编程规约

    时隔一年多,再次开始更新博客,各位粉丝们久等了.大家是不是以为我像大多数开发者一样三分钟热度,坚持了一年半载就放弃了,其实不是.在过去的一年时间我学习了<Java编程思想>这本书,因为都是 ...

  7. ctfshow—web—web签到题

    打开靶机,发现只有一句话 查看源码 发现一段字符串,猜是base64加密 拿到flag

  8. linux中进制转换

    方式一:使用$[]或$(()) 格式为:$[base#number]或$((base#number)),其中base为进制,number为对应进制数. 这种方式输入2进制.16进制等,但只能输出为10 ...

  9. 华为刘腾:华为终端云Cassandra运维实践分享

    点击此处观看完整活动视频 各位线上的嘉宾朋友大家好,我是来自华为消费者BG云服务部的刘腾,我今天给大家分享的主题是华为终端云Cassandra运维实践.和前面王峰老师提到的Cassandra在360中 ...

  10. __init__ raises an exception, then __del__ will still be called

    issue 808164: socket.close() doesn't play well with __del__ - Python tracker https://bugs.python.org ...