题意:要求在一个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 }

最新文章

  1. Maven 的classifier的作用
  2. 【BZOJ2223/3524】[Coci 2009]PATULJCI
  3. Xamarin.Android编译提示找不到mscorlib.dll.so文件
  4. linux第2天 信号 wait
  5. Android 查看內存使用
  6. [irving] C# Windows Beep 调用声音文件
  7. cf 357C
  8. Iterator荟萃
  9. [精读]Spationtemporal Saliency Detection Using Textural Contrast and Its Applications
  10. Codeforces Round#297 div2
  11. 一、spark入门之spark shell:wordcount
  12. 【项目1-1】使用HTML5+CSS3绘制HTML5的logo
  13. [Swift]LeetCode797. 所有可能的路径 | All Paths From Source to Target
  14. Service-Level Agreement (服务水平协议)
  15. Bulbs【暴力?】
  16. zoj 2104 Let the Balloon Rise(map映照容器的应用)
  17. 用sparkR, 分析上亿条订单数据的脚本。
  18. Win7 user profile cant logon
  19. Opengl绘制我们的小屋(三)纹理绘制
  20. OpenGL中各种坐标系的理解

热门文章

  1. 【Oracle】to_data() to_char()用法解析
  2. 攻防世界—pwn—cgpwn2
  3. cursor pin s和cursor pin s wait on x
  4. SQL Server 日志收缩方法
  5. 提取当前文件夹下的所有文件名.bat(Windows批处理文件)
  6. 如何将python中pip源设置为国内源
  7. 接口新建学习---HTTP请求默认值
  8. 在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。
  9. 理想的DevOp流程怎么做?看看Slack的代码部署实践 原创 Michael Deng 高可用架构 今天
  10. c++ 三五法则 自己理解