[noip模拟题]科技节 - 搜索 - 位运算优化
【问题描述】
一年一度的科技节即将到来。同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那么多活动,还要不要认真学习了?!这样不行!……于是,校长要求减少一些活动,使每位学生只能参加一项(一名同学要参加某活动,必须已报名且该活动未被去掉)。当然,他也不希望哪位同学因此不能参加任何活动。他想知道自己的方案能否实行。
【输入】
输入文件名为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模拟题]科技节 - 搜索 - 位运算优化的更多相关文章
- POJ - 3074 Sudoku (搜索)剪枝+位运算优化
In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- 数独求解问题(DFS+位运算优化)
In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
- N皇后解法以及位运算优化
N皇后解法以及位运算优化 观察棋盘,要求皇后之间不能处在同行同列同一条斜线,求使得每行都有一个皇后的放置方法共有多少种. 每尝试放置一个皇后,都可以把该位置所在的行.列标号用一个数组标记,含义表示该行 ...
- 【入门OJ】2003: [Noip模拟题]寻找羔羊
这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...
- N皇后-位运算优化
N皇后问题 时间限制: 5 Sec 内存限制: 128 MB 题目描述 魔法世界历史上曾经出现过一个伟大的罗马共和时期,出于权力平衡的目的,当时的政治理论家波利比奥斯指出:“事涉每个人的权利,绝不应 ...
- 9.9 NOIP模拟题
9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...
- 【NOIP模拟题】“与”(位运算)
因为是与运算,所以我们可以贪心地每次找最高位的,将他们加入到新的序列中,然后每一次在这个新的序列继续找下一个位. 然后最后序列中任意两个的与运算的值都是一样的且是最大的. #include <c ...
随机推荐
- Why should we typedef a struct so often in C? - Stack Overflow
https://stackoverflow.com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c As Greg Hewg ...
- Dungeon Master---2251(bfs)
http://poj.org/problem?id=2251 有一个三维的牢房地图 求从S点走E点的最小时间: #include<stdio.h> #include<string.h ...
- 非常可乐---hdu 1495(BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1495 题意: 有3个杯子a b c:a=b+c:然后刚开始时只有a是满的,其它为空的,然后a b c三个之间互相 ...
- AndroidStudio 3.3+ ButterKnife R2 红名问题
如果你一直用着ButterKnife,但是用的低版本(比如用得很多的8.4.0),然后在多module项目中一定知道要把R改成R2 然后最近如果升级AndroidStudio了,升到3.3以上(201 ...
- android(二) SurfaceView
(一)常用类介绍 (1). View:显示视图,内置画布,提供图形绘制函数.触屏事件.按键事件函数等:必须在UI主线程内更新画面,被动更新画面,速度较慢. (2). SurfaceView:基于vie ...
- oj2894(贝尔曼福特模板)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2894 就因为粗心,一中午没A,题目说是2000 ...
- 集成树模型使用自动搜索模块GridSearchCV,stacking
一. GridSearchCV参数介绍 导入模块: from sklearn.model_selection import GridSearchCV GridSearchCV 称为网格搜索交叉验证调参 ...
- MatLab 2014a编译jar包时mcc无法使用的问题
http://blog.csdn.net/heroafei/article/details/43273373 MatLab 2014a编译jar包时mcc无法使用的问题 2015-01-29 16:5 ...
- JQuery中如何使用事件来出发Ajax
$(document).ready(function(){ $("input[name='customer_name']").keydown(func ...
- 优化改良版:数组,List,等集合需要加逗号或其它符合转成字符串
大家经常需要数组加逗号拼接成字符串的情况传统作法就是写for,foreach拼接, 现给出优化改良版数组,List,等集合需要加逗号或其它符合转成字符串方法: List<string> l ...