hdu 4739【位运算】.cpp
题意:
给出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的更多相关文章
- HDU - 2276 位运算矩阵快速幂
挺有意思的一道题 要会运用一些常见的位运算操作进行优化 题目的本质就是要求下面的式子 \(dp[i][j+1]=(dp[i-1][j]+dp[i][j]) \mod 2\) (第\(i\)个字符在\( ...
- hdu 5491(位运算)
题意:给你n,a,b. 希望得到比n大,二进制1的个数在 a ,b之间的最小的数 思路:①满足条件,输出 ②num < a 从右找到是0的最小位,变成1 ③num > b从右到左找是1的最 ...
- hdu 2014 位运算
/* 注意两点 1.从后往前找互补的,刚开始我找的是相邻的但是这个例子就不行101 110 2.因为时累加所以sum可能会超出int范围,这个很重要. */ #include<stdio.h&g ...
- HDU 3006 The Number of set(位运算 状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3006 题目大意:给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.由给出的集合 ...
- HDU 1074 Doing Homework (动态规划,位运算)
HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...
- HDU 3605 Escape (网络流,最大流,位运算压缩)
HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...
- HDU 4949 Light(插头dp、位运算)
比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...
- HDU 2276 Kiki & Little Kiki 2(矩阵位运算)
Kiki & Little Kiki 2 转载自:点这里 [题目链接]Kiki & Little Kiki 2 [题目类型]矩阵位运算 &题意: 一排灯,开关状态已知,每过一秒 ...
- 神奇的Noip模拟试题 T3 科技节 位运算
3 科技节 (scifest.pas/.c/.cpp) [问题描述] 一年一度的科技节即将到来.同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那 ...
随机推荐
- Windows Azure入门教学系列 (二):部署第一个Web Role程序
本文是Windows Azure入门教学的第二篇文章. 在第一篇教学中,我们已经创建了第一个Web Role程序.在这篇教学中,我们将学习如何把该Web Role程序部署到云端. 注意:您需要购买Wi ...
- URL vs. HTML 录制模式
转自:http://blog.csdn.net/testing_is_believing/article/details/5274188 一般来说,如果是标准使用IE访问的B/S架构,应该使用HTML ...
- Eclipse设置Android Logcat输出字体大小
Window -> Preferences -> Android -> Logcat -> Display Font:点击"Change"button 如图 ...
- Servlet的学习之Session(3)
在上一篇<Servlet的学习之Session(2)>我们知道了Session能实现一个会话过程中保存数据或者多个会话中实现同一个Session的关键因素就是Cookie,只是Cookie ...
- appium 真机测试问题 出现 instruments crashed on startup
1.appium 真机测试的时候 instruments crashed on startup,必须在真机上打开UI Automation 在设置里: Developer->Enable UI ...
- php 跳转控制
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ajax后台处理返回json值
public ActionForward xsearch(ActionMapping mapping, ActionForm form, HttpServletRequest request, Htt ...
- vc中改变对话框的背景色
---- 笔者曾在<软件报>2000年第5期中讨论过如何改变控件的颜色,但还有相当一部分的读者来信提问:一个基于对话框的MFC AppWizard应用程序中,如何改变对话框的背景颜色呢?对 ...
- php中include文件变量作用域的研究
原文:php中include文件变量作用域的研究 在php中我们有时候需要include一个文件.比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件 ...
- Swift - 操作表(UIActionSheel)的用法,也叫底部警告框
1,下面创建一个操作表(或叫底部警告框)并弹出显示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class ViewController: UIViewC ...