题意:

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

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

思路:

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

  然后st = 1<<cnt..

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

Tips:

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

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

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

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

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

Code:

 /******************************************
*Author: Griselda
*Created Time: 2013-11-25 15:26
*Filename: 4739.cpp
* ****************************************/
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std; struct Point
{
int x;
int y;
}p[]; struct Set
{
Point p[];
int sta;
}s[]; int cnt, tmp;
int G[][];
int cmp(Point a, Point b)
{
if (a.x != b.x) return a.x < b.x;
else return a.y < b.y;
} bool check(int a, int b, int c, int d)
{
if (p[a].x == p[b].x &&
p[c].x == p[d].x &&
p[a].y == p[c].y &&
p[b].y == p[d].y &&
(p[c].x-p[a].x == p[b].y - p[a].y))
return true;
else return false;
} bool check2(int st)
{
int psum[][], tt = ;
memset(psum, , sizeof(psum));
tmp = ;
for (int i = ; i < cnt; ++i)
if (st&(<<i) && !(tt&s[i].sta)) {
tmp++;
tt |= s[i].sta;
int x1 = s[i].p[].x, y1 = s[i].p[].y, x2 = s[i].p[].x, y2 = s[i].p[].y, x3 = s[i].p[].x, y3 = s[i].p[].y, x4 = s[i].p[].x, y4 = s[i].p[].y;
psum[x1][y1]++, psum[x2][y2]++, psum[x3][y3]++, psum[x4][y4]++;
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;
} else if (st&(<<i) && (tt&s[i].sta)) return false;
return true;
} int main()
{
// freopen("in.txt", "r", stdin);
int n;
int st;
int ans;
while (~scanf("%d", &n)) {
if (n == -) break;
if (n < ) {
puts("");
for (int i = ; i < n; ++i)
scanf("%*d %*d");
continue;
}
memset(G, , sizeof(G));
ans = cnt = ;
for (int i = ; i < n; ++i) {
scanf("%d %d", &p[i].x, &p[i].y);
G[p[i].x][p[i].y]++;
}
sort(p, p+n, cmp); for (int i = ; i < n-; ++i)
for (int j = i+; j < n-; ++j)
for (int k = j+; k < n-; ++k)
for (int l = k+; l < n; ++l)
if (check(i, j, k, l)) {
s[cnt].p[] = p[i], s[cnt].p[] = p[j], s[cnt].p[] = p[k], s[cnt].p[] = p[l];
s[cnt].sta = |(<<i)|(<<j)|(<<k)|(<<l);
cnt++;
}
st = <<cnt;
for (int i = ; i < st; ++i)
if (check2(i)) ans = max(ans, tmp);
printf("%d\n", ans*);
}
return ;
}

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

hdu 4739【位运算】.cpp的更多相关文章

  1. HDU - 2276 位运算矩阵快速幂

    挺有意思的一道题 要会运用一些常见的位运算操作进行优化 题目的本质就是要求下面的式子 \(dp[i][j+1]=(dp[i-1][j]+dp[i][j]) \mod 2\) (第\(i\)个字符在\( ...

  2. hdu 5491(位运算)

    题意:给你n,a,b. 希望得到比n大,二进制1的个数在 a ,b之间的最小的数 思路:①满足条件,输出 ②num < a 从右找到是0的最小位,变成1 ③num > b从右到左找是1的最 ...

  3. hdu 2014 位运算

    /* 注意两点 1.从后往前找互补的,刚开始我找的是相邻的但是这个例子就不行101 110 2.因为时累加所以sum可能会超出int范围,这个很重要. */ #include<stdio.h&g ...

  4. HDU 3006 The Number of set(位运算 状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3006 题目大意:给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.由给出的集合 ...

  5. HDU 1074 Doing Homework (动态规划,位运算)

    HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...

  6. HDU 3605 Escape (网络流,最大流,位运算压缩)

    HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...

  7. HDU 4949 Light(插头dp、位运算)

    比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...

  8. HDU 2276 Kiki & Little Kiki 2(矩阵位运算)

    Kiki & Little Kiki 2 转载自:点这里 [题目链接]Kiki & Little Kiki 2 [题目类型]矩阵位运算 &题意: 一排灯,开关状态已知,每过一秒 ...

  9. 神奇的Noip模拟试题 T3 科技节 位运算

    3 科技节 (scifest.pas/.c/.cpp) [问题描述] 一年一度的科技节即将到来.同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那 ...

随机推荐

  1. 免插件打造wordpress投稿页面

    一.新建投稿页面模板 把主题的 page.php 另存为 tougao.php,并且在第一行的 <?php 之后添加模板的标识注释: /* Template Name: tougao */ 紧接 ...

  2. 【linux】内核+文件系统下载到开发板

    K开发 欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:htt ...

  3. SSH2三大框架整合出错(四)

    <%@taglib prefix="c" uri="http://java.sun.com/jsf/core" %> usage: java org ...

  4. How to retreive raw post data from HttpServletRequest in java

    public static String getPostData(HttpServletRequest req) { StringBuilder sb = new StringBuilder(); t ...

  5. nginx的sendfile指令的作用

    linux为了解决对读文件产生的从应用空间到内核空间复制数据产生的效率影响引进了零拷贝.什么是零拷贝?这里就不多说了,请参考http://blog.csdn.net/crazyguang/articl ...

  6. boost.asio系列——socket编程

    asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下: #include &l ...

  7. Swift - 设置程序的应用图标和启动界面

    一个应用,无论发布到App Store,还是安装到用户的屏幕上,都需要一个标志性的图标.同时,在应用启动时也要有个启动画面,否则启动时将会是纯黑的屏幕. 1,在项目的“General”选项卡下的“Ap ...

  8. ubuntu环境ceph配置入门(一)

    环境:ubuntu server 14.04 64bit,安装ceph版本号0.79 正常情况下应有多个主机,这里为了高速入门以一台主机为例,多台主机配置方式类似. 1. 配置静态IP及主机名 静态I ...

  9. 嵌入式Linux常见问题

    Linux问题集 1 linux设置环境变量及保存地点 1. 显示环境变量HOME $ echo $HOME /home/terry 2. 设置一个新的环境变量WELCOME $ exportWELC ...

  10. Java线程并发中常见的锁--自旋锁 偏向锁

    随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想 ...