【问题描述】

一年一度的科技节即将到来。同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那么多活动,还要不要认真学习了?!这样不行!……于是,校长要求减少一些活动,使每位学生只能参加一项(一名同学要参加某活动,必须已报名且该活动未被去掉)。当然,他也不希望哪位同学因此不能参加任何活动。他想知道自己的方案能否实行。

【输入】

输入文件名为scifest.in。

输入数据包括多组。

对于每组数据:

第一行两个正整数n和m,分别表示活动数和学生数。

接下来n行,每行m个为0或1的数。第i+1行第j列的数若为1,表示j同学报名参加活动i,否则表示j同学没有报名参加活动i。

【输出】

输出文件名为scifest.out。

对于每组数据输出一行,若校长方案可行则输出“Yes”,否则输出“No”。(均不包括引号)

【输入输出样例】

scifest.in

scifest.out

3 3

0 1 0

0 0 1

1 0 0

4 4

0 0 0 1

1 0 0 0

1 1 0 1

0 1 0 0

Yes

No

【数据范围】

对于20%的数据,n≤10,m≤200,数据组数≤10;

对于60%的数据,n≤16,m≤300,数据组数≤100;

对于100%的数据,n≤16,m≤300,数据组数≤1,000。


  这题开始以为是用动态规划,后来发现n这么小应该使用搜索,后来经老师介绍,如果纯搜索+数组的话只能过6组数据,而加上二进制就可以全过

  boolean数组其实既浪费内存又浪费时间,1个字节8个二进制位,而事实上储存true和false只用1个二进制位,所以用unsigned int类型的32个二进制位

来存储这些true和false的数据。其它都比较简单,直接就发代码了

Code

 #include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
using namespace std;
#define k 32
typedef bool boolean;
ifstream fin("scifest.in");
ofstream fout("scifest.out");
boolean found;
int m,n;
int buf;
typedef struct myData{
int peo;
unsigned int activities[];
}myData;
myData *s;
unsigned int ac[];
boolean cmp(const myData& a,const myData& b){
return a.peo > b.peo;
}
boolean init(){
if(!(fin>>n>>m)) return false;
s = new myData[(const int)(n + )];
found = false;
for(int i = ;i < n;i++){
s[i].peo = ;
memset(s[i].activities, , sizeof(s[i].activities));
for(int j = ;j < m;j++){
fin>>buf;
if( buf == ){
s[i].peo++;
s[i].activities[j/k] += << (j % k);
}
}
}
sort(s,s + n,cmp);
return true;
}
void free_MyPointer(){
delete[] s;
}
void find(int vi,unsigned int *sed,int join){
if(vi == n){
if(join == m) found = true;
return ;
}
unsigned int t[];
boolean aFlag = true;
for(int i = ;i <= m/k;i++){
if((sed[i] & s[vi].activities[i]) != ){
aFlag = false;
break;
}
t[i] = sed[i] | s[vi].activities[i];
}
if(aFlag) find(vi + , t, join + s[vi].peo);
if(!found) find(vi + , sed, join);
}
int main(){
while(init()){
find(, ac, );
if(found) fout<<"Yes"<<endl;
else fout<<"No"<<endl;
free_MyPointer();
}
return ;
}

[noip模拟题]科技节 - 搜索 - 位运算优化的更多相关文章

  1. POJ - 3074 Sudoku (搜索)剪枝+位运算优化

    In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...

  2. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  3. 数独求解问题(DFS+位运算优化)

    In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...

  4. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  5. N皇后解法以及位运算优化

    N皇后解法以及位运算优化 观察棋盘,要求皇后之间不能处在同行同列同一条斜线,求使得每行都有一个皇后的放置方法共有多少种. 每尝试放置一个皇后,都可以把该位置所在的行.列标号用一个数组标记,含义表示该行 ...

  6. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  7. N皇后-位运算优化

    N皇后问题 时间限制: 5 Sec  内存限制: 128 MB 题目描述 魔法世界历史上曾经出现过一个伟大的罗马共和时期,出于权力平衡的目的,当时的政治理论家波利比奥斯指出:“事涉每个人的权利,绝不应 ...

  8. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  9. 【NOIP模拟题】“与”(位运算)

    因为是与运算,所以我们可以贪心地每次找最高位的,将他们加入到新的序列中,然后每一次在这个新的序列继续找下一个位. 然后最后序列中任意两个的与运算的值都是一样的且是最大的. #include <c ...

随机推荐

  1. ndk http://www.th7.cn/Program/Android/201412/334955.shtml

    http://www.th7.cn/Program/Android/201412/334955.shtml http://ruikye.com/2014/08/30/androidstudio_ndk ...

  2. 《MYSQL必知必会2

    60.NULL是没有值,空串是一个有效值61.主键只能使用不允许未NULL值的列62.每个表只允许一个auto_increment列63.不允许使用函数作为默认值,只支持常量64.InnoDB 支持事 ...

  3. 《Mysql 索引》

    一:索引概述? - 数据库里的数据是以文件的形式存储的,里面放了我们的各种数据.就和一本书一样. - 通俗的来说,索引就像一个书签一样,可以直接帮我们找到内容,避免了我们一页一页找. - 就像你不会给 ...

  4. Python开发【模块】:Weakref

    Weak references 前言: weakref模块允许python开发者创建弱引用对象. 再接下来中,术语referent代表被弱引用所引用的对象. 一个弱引用对于对象是不能够保持对象存活的: ...

  5. 洛谷P2444 病毒 [POI2000] AC自动机

    正解:AC自动机 解题报告: 传送门! 首先看到这种题目二话不说先把trie树和fail指针建立起来 然后就想鸭,如果我们想让模式串和文本串尽量不能匹配,就要想办法让它跳fail指针,而不是继续往下走 ...

  6. xls的读写

    import xlrd # 读取xls文件 # 打开xls文件 data = xlrd.open_workbook('x1.xls') print(type(data)) # 获取表Sheet1 ta ...

  7. SQL SERVER深入学习学习资料参考

    SQL SERVER深入学习学习资料参考 1.微软Webcast<sql server 2000完结篇>. 尽管微软Webcast出了很多关于Sql Server的系列课程,但是最为深入讲 ...

  8. you

    抑制幽门螺旋杆菌: 1.西兰花 鲜嫩的西兰花蔬菜,含有一种物质叫异硫氰酸酯,这种物质就是幽门螺杆菌的 " 天敌 ",可达到百分百抑制的作用,甚至还有医生给了它一个最强天然抗生素的称 ...

  9. pip第三方模块

    在安装好pip的情况下,在cmd窗口调用命令:pip install package -i --trusted-host http://pypi.douban.com/simple(这是豆瓣的源)

  10. 使用Python2.7 POST 数据到 onenet 平台

    功能 发送数据名称为SENSORID(这里用TEST测试),数值为VALUE(这里用49值做测试)的数据,发送到自己的onenet对应设备 效果发送成功 代码 # -*- coding: utf-8 ...