zoukankan      html  css  js  c++  java
  • hdu 4739【位运算】.cpp

    题意:

    给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形..

    问最多可以拿走多少个正方形..

    思路:

      先找出可以组成正方形的地雷组合cnt个..

      然后st = 1<<cnt..

      用位运算来考虑取哪一个组合可以拿走最多的地雷且满足题目条件..

    Tips:

      题目比较烦恼的地方是解决:

      ①. 所选集合里面的地雷会不会重复拿..

      ②. 所选集合里面在同一个地方取走的地雷会不会比该地方题目给出的地雷数多..

      同一个地点可能有多个地雷,如果用去重就不好算多个正方形在同一个位置的情况..

      所以不去重,但是在计算组合的时候要考虑某一个地点的地雷取了多少次,是否比题目给出的该地点的地雷数少..

    Code:

     1 /******************************************
     2 *Author:         Griselda
     3 *Created Time:   2013-11-25 15:26
     4 *Filename:       4739.cpp
     5 * ****************************************/
     6 #include <stdio.h>
     7 #include <cstring>
     8 #include <algorithm>
     9 using namespace std;
    10 
    11 struct Point
    12 {
    13     int x;
    14     int y;
    15 }p[30];
    16 
    17 struct Set
    18 {
    19     Point p[4];
    20     int sta;
    21 }s[200];
    22 
    23 int cnt, tmp;
    24 int G[110][110];
    25 int cmp(Point a, Point b)
    26 {
    27     if (a.x != b.x) return a.x < b.x;
    28     else return a.y < b.y;
    29 }
    30 
    31 bool check(int a, int b, int c, int d)
    32 {
    33     if (p[a].x == p[b].x &&
    34         p[c].x == p[d].x &&
    35         p[a].y == p[c].y &&
    36         p[b].y == p[d].y &&
    37         (p[c].x-p[a].x == p[b].y - p[a].y))
    38         return true;
    39     else return false;
    40 }
    41 
    42 bool check2(int st)
    43 {
    44     int psum[110][110], tt = 0;
    45     memset(psum, 0, sizeof(psum));
    46     tmp = 0;
    47     for (int i = 0; i < cnt; ++i)
    48         if (st&(1<<i) && !(tt&s[i].sta)) {
    49             tmp++;
    50             tt |= s[i].sta;
    51             int x1 = s[i].p[0].x, y1 = s[i].p[0].y, x2 = s[i].p[1].x, y2 = s[i].p[1].y, x3 = s[i].p[2].x, y3 = s[i].p[2].y, x4 = s[i].p[3].x, y4 = s[i].p[3].y;
    52             psum[x1][y1]++, psum[x2][y2]++, psum[x3][y3]++, psum[x4][y4]++;
    53             if (psum[x1][y1] > G[x1][y1] || psum[x2][y2] > G[x2][y2] || psum[x3][y3] > G[x3][y3] || psum[x4][y4] > G[x4][y4]) return false;
    54         } else if (st&(1<<i) && (tt&s[i].sta)) return false;
    55     return true;
    56 }
    57 
    58 int main()
    59 {
    60 //    freopen("in.txt", "r", stdin);
    61     int n;
    62     int st;
    63     int ans;
    64     while (~scanf("%d", &n)) {
    65         if (n == -1) break;
    66         if (n < 4) {
    67             puts("0");
    68             for (int i = 0; i < n; ++i)
    69                 scanf("%*d %*d");
    70             continue;
    71         }
    72         memset(G, 0, sizeof(G));
    73         ans = cnt = 0;
    74         for (int i = 0; i < n; ++i) {
    75             scanf("%d %d", &p[i].x, &p[i].y);
    76             G[p[i].x][p[i].y]++;
    77         }
    78         sort(p, p+n, cmp);
    79 
    80         for (int i = 0; i < n-3; ++i)
    81             for (int j = i+1; j < n-2; ++j)
    82                 for (int k = j+1; k < n-1; ++k)
    83                     for (int l = k+1; l < n; ++l)
    84                         if (check(i, j, k, l)) {
    85                             s[cnt].p[0] = p[i], s[cnt].p[1] = p[j], s[cnt].p[2] = p[k], s[cnt].p[3] = p[l];
    86                             s[cnt].sta = 0|(1<<i)|(1<<j)|(1<<k)|(1<<l);
    87                             cnt++;
    88                         }
    89         st = 1<<cnt;
    90         for (int i = 0; i < st; ++i)
    91             if (check2(i)) ans = max(ans, tmp);
    92         printf("%d
    ", ans*4);
    93     }
    94     return 0;
    95 }
    View Code

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4739

  • 相关阅读:
    SOD-80 LL34 DL-35 (2.7~75V)贴片稳压二极管【worldsing 笔记
    射频识别技术漫谈(7)——ID卡【worldsing笔记】
    射频识别技术漫谈(6)——通讯协议概述【worldsing笔记】
    射频识别技术漫谈(5)——防冲突【worldsing 笔记】
    Modbus Poll master-slave测试 Dtech USB转485(worldsing 笔记)
    超级MINI STLINK V2 官方固件自动升级 ST-Link 【worldsing 笔记】
    FreeModbus Slave For AVR源代码 精简版2 【worldsing 笔记】
    射频识别技术漫谈(4)——数据编码【worldsing 笔记】
    射频识别技术漫谈(3)——能量、调制【worldsing 笔记】
    FreeModbus Slave 改进的eMbPoll()【worldsing 笔记】
  • 原文地址:https://www.cnblogs.com/Griselda/p/3471056.html
Copyright © 2011-2022 走看看