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) [问题描述] 一年一度的科技节即将到来.同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那 ...
随机推荐
- ASP.NET - 缓存(Cache)
页面缓存: 给页面添加<%@ OutPutCache Duration = “15” VaryByParam = “none” %> 这样就可以启用页面缓存了,那么在规定的时间内,页面之访 ...
- hdu4726贪心
Kia's Calculation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- python 站点爬虫 下载在线盗墓笔记小说到本地的脚本
近期闲着没事想看小说,找到一个全是南派三叔的小说的站点,决定都下载下来看看,于是动手,在非常多QQ群里高手的帮助下(本人正則表達式非常烂.程序复杂的正则都是一些高手指导的),花了三四天写了一个脚本 须 ...
- c# in depth之泛型的实现
1.默认值表达式 如果已经明确了要处理的类型,也就知道了它的“默认”值.不知道要引用的类型,就不能直接指定默认值.不能使用null,因为它可能不是一个引用类型,不能使用0,因为它可能不是数值类型.虽然 ...
- SilkTest Q&A 11
101. 如何从其他的机器访问脚本? 答案:将包含脚本的文件夹共享出来…非常简单…你可以使用connect()在你本机运行脚本从而使得它们在其他的一些机器上执行…但是其他人无法访问这些脚本,除非你将它 ...
- 《C++语言基础》实践參考——数组作数据成员
返回:贺老师课程教学链接 [项目5 - 数组作数据成员]阅读教材P255例8.4.注意到类中的数据成员能够是数组.设计一个工资类(Salary),当中类的数据成员例如以下: class Salary ...
- WebBrowser脚本错误的完美解决方案
原文:WebBrowser脚本错误的完美解决方案 当IE浏览器遇到脚本错误时浏览器,左下角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框.当我们使用WebBrowse ...
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
- FFT算法的物理意义
FFT是离散傅立叶变换的高速算法,能够将一个信号变换到频域.有些信号在时域上是非常难看出什么特征的,可是如果变换到频域之后,就非常easy看出特征了.这就是非常多信号分析採用FFT变换的原因.另外,F ...
- Delphi读写UTF-8、Unicode格式文本文件
// UTF-8文件写入函数procedure SaveUTFFile(const FileName: string; S: string; WriteHeader: Boolean = True); ...