题意:

给出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. EasyUI - DataGrid 组建 - [ 排序功能 ]

    效果: 红框的字段看,为设置了,列排序,向后台Post数据sort/order. 原理:向后台POST数据,sort/post数据. html代码: <table id="tab&qu ...

  2. QT+vs2010下改变可执行程序的图标

    原地址:http://blog.163.com/tijijun@126/blog/static/6820974520134209457308/ 在解决方案下面的工程里,点击右键 ->选择[添加( ...

  3. js 动态切换视频

    如图所示,想要一个这样的效果,就是点击下面视频标题时,上面的视频跟着切换,但是要求页面不重新加载. 参考文章在这里 这里贴上部分代码供大家参考. <li id="about_li6&q ...

  4. javascript定义类和类的实现

    首先说说类,在一个类里我们会有以下的几个特征: 1. 公有方法 2. 私有方法 3. 属性 4. 私有变量 5. 析构函数 我们直接看一个例子: /***定义类***/ var Class = fun ...

  5. Go语言 关于go error处理风格的一些讨论和个人观点(上)

    原创文章.转载请注明出处:server非业余研究-sunface 近期看谷歌go group里面有非常多讨论go error处理风格的问题,颇有启示.如今跟大家分享一下.首先请看一个提问: Hi fo ...

  6. 使用BigDecimal来进行精确计算

    在一些以金融等行业中的计算是需要十分精确的,即使我们使用像double这样的类型,由于浮点数的原因,会使得数据计算变得不精确,例如下面的例子: double a = 0.1; double b = 0 ...

  7. DELPHI XE7 新的并行库

    DELPHI XE7 的新功能列表里面增加了并行库System.Threading, System.SyncObjs. 为什么要增加新的并行库? 还是为了跨平台.以前要并行编程只能从TThread类继 ...

  8. [置顶] Asp.Net---css样式的使用方式

    Css样式的使用大致分为三种 咱们先来看看一张总括图 1 使用连接的形式调用 有两种发方式调用: A   使用link标签 将样式规则写在.Css的样式文档中,再以<link>标签引入 如 ...

  9. JSP的include指令

    JSP的include 指令:向当前页面中插入的一个静态文件的内容. 在test5.jsp里面 <%@ include file="test5_1.jsp" %> 新建 ...

  10. jQuery实现可编辑表格

    在很多的网页中,这个可编辑表格在许多地方都是非常有用,配合上AJAX技术能够实现很好的用户体验,下面我 们就jQuery来说明一下可编辑表格的实现步骤 首先是HTML代码,非常简单 <!DOCT ...