3 科技节

(scifest.pas/.c/.cpp)

【问题描述】

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

【输入】

输入文件名为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。

解题报告:

  这道题好像是我在这套题里唯一做了的,用了一个搜索,每次去找只选了唯一活动的学生,做标记,没有唯一的就找哪一个活动参与的人最少,然后删去。再重复刚才的步骤,直到所有未被删的都是唯一标记,若不是,就为No.我觉得并没有错,可是,可是,我把n和m看反了。。输入都是对的,后来进入搜索就忘了,于是,全错,还有,我连Yes,No 都输出的是YES NO ,能不全错吗?.......

  那天因为时间原因,我也没有去调试改错,看一下我原程序的错误,这里便给一个标程的解释吧。

  标程也是用的搜索,只不过它是记录的选中的活动及其人数,再加上 位运算 的使用,十分巧妙。位运算也是以前讲过的,复习一下:

&:0 1 0 1        | :0 1 0 1          ^: 0 1 0 1

1 1 0 0             1 1 0 0              1 1 0 0

0 1 0 0             1 1 0 1              1 0 0 1

  下面是对标程中的一些难理解的代码的解释:

 int x[][],h[];

x[20][10]:最大二进制数31位,此处有300个学生,把每一项活动的300个用10组二进制数记录其 1 的位置。

               if (a==)
{
x[i][j/]+=<<(j%);
h[i]++;
}

1、x[i][j/31]:第 i  个项目 第 k 组 ,如果参加。一个二进制数为32位,一位符号位,/31 即这个1 在第几组 上,j %31 即这一组的第几位上是 1。

 for ( i=;i<;i++)
{
if ((s[i]&x[p][i])>) break;
t[i]=s[i]|x[p][i];
}

这里是选择活动时的操作:s[i]是已经选了的活动。&:如果s[i]与x[p][i]上的1 有重复,(如:0 1 0 1&1 1 0  0),则说明一个人有两个活动了,break;

| :如果选这个活动这个人本来没有选的,s[i]这一位上为0,则这项活动可以选(如:0 1 0 1|1 0 0 0  [第二行的1可以选])

另外,还要按照活动的参与人数进行排序,人多的先选。

下面是完整代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,m;
int x[][],h[];
bool yes=;
void work()
{
memset(x,,sizeof (x));
for (int i=;i<n;i++)
{
h[i]=;
for (int j=;j<m;j++)
{
int a;
scanf("%d",&a);
if (a==)
{
x[i][j/]+=<<(j%);
h[i]++;
}
}
}
int k;
for (int i=;i<n-;i++) //? n-1
for (int j=i+;j<n;j++)
{
if (h[i]<h[j])
{
k=h[i];h[i]=h[j];h[j]=k;
for (int t=;t<;t++)
{
int u=x[i][t];x[i][t]=x[j][t];x[j][t]=u;
}
}
}
}
void doit(int p,int s[],int have)
{
if (p==n)
{
if (have==m) yes=;
return ;
}
int t[],i;
for ( i=;i<;i++)
{
if ((s[i]&x[p][i])>) break;
t[i]=s[i]|x[p][i];
}
if (i==) doit(p+,t,have+h[p]);
if (!yes) doit(p+,s,have);
}
int main()
{
freopen("scifest.in","r",stdin);
freopen("scifest.out","w",stdout);
while (scanf("%d%d",&n,&m)==)
{
work();
yes=;
doit(,x[],);//***p=0
if (yes==) printf("Yes\n");
else printf("No\n");
}
return ;
}

注意:赋初值。

神奇的Noip模拟试题 T3 科技节 位运算的更多相关文章

  1. 神奇的NOIP模拟赛 T3 LGTB 玩THD

    LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...

  2. 【数论+技巧】神奇的Noip模拟试题第二试 T1 素数统计

    1.      素数统计 (pcount.pas/.c/.cpp) [问题描述] 小tan的老师揣谙戈给同学们布置了一道题,要求统计给定区间内素数的个数.“这不是很简单吗?”小tan忍不住说.揣谙戈冷 ...

  3. 神奇的Noip模拟试题一试 2 排队

    2 排队 (lineup.pas/.c/.cpp) [问题描述] 小sin所在的班有n名同学,正准备排成一列纵队,但他们不想按身高从矮到高排,那样太单调,太没个性.他们希望恰好有k对同学是高的在前,矮 ...

  4. 神奇的Noip模拟试题第一试 合理种植 枚举+技巧

    1.合理种植 (plant.pas/.c/.cpp) [问题描述] 大COS在氯铯石料场干了半年,受尽了劳苦,终于决定辞职.他来到表弟小cos的寒树中学,找到方克顺校长,希望寻个活干. 于是他如愿以偿 ...

  5. 9.20 noip模拟试题

      Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我 ...

  6. 11.12 noip模拟试题

    题目名称 加密 冒泡排序图 重建可执行文件名 encrypt bubble rebuild输入文件名 encrypt.in bubble.in rebuild.in输出文件名 encrypt.in b ...

  7. 11.14 noip模拟试题

      题目名称 正确答案 序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer ...

  8. 10.18 noip模拟试题

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...

  9. 20161005 NOIP 模拟赛 T3 解题报告

    subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...

随机推荐

  1. CentOS7静默安装oracle11g

    操作系统: [root@docker ~]# uname -m x86_64 [root@docker ~]# cat /etc/redhat-release CentOS Linux release ...

  2. Windows的命令行查看,修改,删除,添加环境变量

    查看当前所有可用的环境变量:输入 set 即可查看. 显示某环境变量: 例如:echo %SystemDrive% 类似linux下面的echo $PATH这种用法. 首先明确一点:所有的在cmd命令 ...

  3. 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor

    开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...

  4. Android 监听键盘的弹起与收缩

    Android 监听键盘的弹起与收缩 由于android不存在该监听的API 所以需要自己去处理 先上代码 /* android:windowSoftInputMode="stateAlwa ...

  5. jsp实时显示后台批处理进度 - out分块,简单的长连接方式

    这两天在实现一个批处理操作,但是想让前台实时显示后台批处理进度,本想着用复杂一些的框架可以实现异步信息调用 但是鉴于是内部管理系统,且只有一两个人用到这个功能,所以做了一个简单的长连接方式的实时响应 ...

  6. 转:union 联合体(共用体)

    转自:http://blog.csdn.net/xiao3404/article/details/22276485 2.共用体 2.1共用体的概念 共用体是一种构造类型的数据结构.在一个“共用体”内可 ...

  7. 安卓App热补丁动态修复技术介绍

    版权声明:本文由johncz原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/169 来源:腾云阁 https://www.q ...

  8. 2016年Web前端面试题目汇总

    转载: 2016年Web前端面试题目汇总 以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中未解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢 ...

  9. jmeter笔记5

    性能测试是任何分布式或Web应用程序测试计划的重要组成部分.在计划和开发周期中进行性能评价,可以保证交付给客户的应用程序满足客户对于高负载.可用性和可伸缩性的要求.提前确定软件的负载限制可以为适当地进 ...

  10. (13)odoo翻译

    -------------------更新时间:15:52 2016-09-28 星期三 增加模型名翻译17:26 2016-05-20 星期五17:58 2016-05-17 星期二12:14 20 ...