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\n",an[i][0],an[i][1]);

61         }

62         else printf("IMPOSSIBLE \n");

63     }

64     return 0;

65 }

 

你可能感兴趣的:(uva)