zoukankan      html  css  js  c++  java
  • 8-4 Fabled Rooks uva11134

      题意:你的任务是在n*n的棋盘上放 n 小于5000 个车 使得任意两个车不互相攻击 且第i个车在一个给定的矩形ri之内  给出该矩形左上角坐标和右下角坐标四个点  必须满足放车的位置在矩形内  边上也行  如果无解输出IMPSSIBLE

    行与列是独立的   所以可以分割成两个一模一样的子问题   贪心

    要以右边界升序排序   我一开始按照左边界排序错了   举个例子   1-1  1-3 2-2  这样的话就会错     1-1 2-2 1-3才对  

    还有就是注意细节  sort 从一开始的话 都要加一,,,

    #include<bits/stdc++.h>
    using namespace std;
    #define N 5010
    int n,k;
    int vis[N];
    struct node
    {
        int id;
        int x,y;
        int x1,x2,y1,y2;
    
    }chess[N];
    
    bool cmp1(node a,node b)
      {
        return a.x2<b.x2||(a.x2==b.x2&&a.x1<b.x1);
      }
    bool cmp2(node a,node b)
      {
       return a.y2<b.y2||(a.y2==b.y2&&a.y1<b.y1);
      }
    bool cmp3(node a,node b)
       {
        return a.id<b.id;
       }
    int main()
    {
        while(cin>>n,n)
        {
            int flag=1;
            for(int i=0;i<n;i++)
            {
               chess[i].id=i;
               scanf("%d%d%d%d",&chess[i].x1,&chess[i].y1,&chess[i].x2,&chess[i].y2);
            }
            sort(chess,chess+n,cmp1);
            memset(vis,0,sizeof vis);
    
            for(int i=0;i<n;i++)
            {
                int ok=0;
                for(int j=chess[i].x1;j<=chess[i].x2;j++)
                {
                    if(!vis[j]){ok=1;vis[j]=1;chess[i].x=j;break; }//把chess里面的i写成了j  强行将自己dubug了半个小时。。。
                }
                if(!ok){flag=0;}
            }
             sort(chess,chess+n,cmp2);
              memset(vis,0,sizeof vis);
             for(int i=0;i<n;i++)
            {
                int ok=0;
                for(int j=chess[i].y1;j<=chess[i].y2;j++)
                {
                    if(!vis[j]){ok=1;vis[j]=1;chess[i].y=j;break; }
                }
                if(!ok){flag=0;}
            }
            sort(chess,chess+n,cmp3);
           if(flag)
            for(int i=0;i<n;i++)
                printf("%d %d
    ",chess[i].x,chess[i].y);
           else printf("IMPOSSIBLE
    ");
        }
    }

    LRJ的代码  更慢

    #include<cstdio>
    #include<cstring>
    #include <algorithm>
    using namespace std;
    
    // solve 1-D problem: find c so that a[i] <= c[i] <= b[i] (0 <= i < n)
    bool solve(int *a, int *b, int *c, int n) {
      fill(c, c+n, -1);
      for(int col = 1; col <= n; col++) {
        // find a rook with smalleset b that is not yet assigned
        int rook = -1, minb = n+1;
        for(int i = 0; i < n; i++)
          if(c[i] < 0 && b[i] < minb && col >= a[i]) { rook = i; minb = b[i]; }
        if(rook < 0 || col > minb) return false;
        c[rook] = col;
      }
      return true;
    }
    
    const int maxn = 5000 + 5;
    int n, x1[maxn], y1[maxn], x2[maxn], y2[maxn], x[maxn], y[maxn];
    
    int main() {
      while(scanf("%d", &n) == 1 && n) {
        for (int i = 0; i < n; i++)
          scanf("%d%d%d%d", &x1[i], &y1[i], &x2[i], &y2[i]);
        if(solve(x1, x2, x, n) && solve(y1, y2, y, n))
          for (int i = 0; i < n; i++) printf("%d %d
    ", x[i], y[i]);
        else
          printf("IMPOSSIBLE
    ");
      }
      return 0;
    }
  • 相关阅读:
    mysql如何通过单个ibd文件进行数据恢复
    Python3-插件you-get使用
    使用RestTemplate调用接口上传文件
    javax.validation分组校验(简短版)
    javax.validation分组校验(详解版)
    javax.validation分组校验
    IDEA如何生成JavaDoc文档
    如何使用redis生成唯一编号及原理
    全国最新各省、市、县、镇、村数据库,详细到村的数据
    Axure RP Extension for Chrome安装
  • 原文地址:https://www.cnblogs.com/bxd123/p/10432674.html
Copyright © 2011-2022 走看看