UVA 11134 Fabled Rooks 贪心

题目链接:UVA - 11134

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

算法分析:刚开始没有思路,后来看了别人的博客有了一点想法。我们把矩形的行和列分开解决,即n个车首先不能放置在同一行,然后判断n个车不能放置在同一列,如果都满足的话,即有正确的方法,否则就不行。那么怎样解决和判断在不在同一行并且是否可行呢,我们针对行而言,把这些行的坐标存入优先队列,首先取出最上面(行的标号较小)的,先放它,然后,再放下面的,依次往下撸就可以了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #define inf 0x7fffffff
 9 using namespace std;
10 const int maxn=5000+10;
11 
12 int n;
13 struct node
14 {
15     int l,r;
16     int id;
17     friend bool operator < (node a,node b)
18     {
19         if (a.l != b.l) return a.l > b.l ;
20         return a.r > b.r ;
21     }
22 }arr[maxn],arr2[maxn];
23 int an[maxn][2];
24 
25 int solve(node *a,int pos)
26 {
27     priority_queue<node> Q;
28     for (int i=0 ;i<n ;i++) Q.push(a[i]);
29     int weizhi=0;
30     while (!Q.empty())
31     {
32         node temp=Q.top() ;Q.pop() ;
33         if (temp.r<weizhi) return 0;
34 
35         if (temp.l<weizhi)
36         {
37             temp.l=weizhi;
38             Q.push(temp);
39             continue;
40         }
41         int m=max(temp.l,weizhi);
42         an[temp.id ][pos]=m;
43         weizhi=m+1;
44     }
45     return 1;
46 }
47 
48 int main()
49 {
50     while (scanf("%d",&n)!=EOF && n)
51     {
52         for (int i=0 ;i<n ;i++)
53         {
54             scanf("%d%d%d%d",&arr[i].l,&arr2[i].l,&arr[i].r,&arr2[i].r);
55             arr[i].id=arr2[i].id=i;
56         }
57         if (solve(arr,0) && solve(arr2,1))
58         {
59             for (int i=0 ;i<n ;i++)
60                 printf("%d %d
",an[i][0],an[i][1]);
61         }
62         else printf("IMPOSSIBLE 
");
63     }
64     return 0;
65 }
原文地址:https://www.cnblogs.com/huangxf/p/4457630.html