2017.07.05【NOIP提高组】模拟赛A组 灯
来源:互联网 发布:web服务器端编程 编辑:程序博客网 时间:2024/05/17 01:20
Description
贝希和她的闺密们在她们的牛棚中玩游戏。但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了。贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望。她希望您能够帮帮她,把所有的灯都给重新开起来!她才能继续快乐地跟她的闺密们继续玩游戏!
牛棚中一共有N(1 <= N <= 35)盏灯,编号为1到N。这些灯被置于一个非常复杂的网络之中。有M(1 <= M <= 595)条很神奇的无向边,每条边连接两盏灯。
每盏灯上面都带有一个开关。当按下某一盏灯的开关的时候,这盏灯本身,还有所有有边连向这盏灯的灯的状态都会被改变。状态改变指的是:当一盏灯是开着的时候,这盏灯被关掉;当一盏灯是关着的时候,这盏灯被打开。
问最少要按下多少个开关,才能把所有的灯都给重新打开。
数据保证至少有一种按开关的方案,使得所有的灯都被重新打开。
Input
第一行:两个空格隔开的整数:N和M。
第二到第M+1行:每一行有两个由空格隔开的整数,表示两盏灯被一条无向边连接在一起。没有一条边会出现两次。
Output
第一行:一个单独的整数,表示要把所有的灯都打开时,最少需要按下的开关的数目。
Sample Input
5 6
1 2
1 3
4 2
3 4
2 5
5 3
Sample Output
3
Solution
暴力
但是直接暴力是
那么采取折半搜索的方式,分成
显然每个开关只会按一次
用
C++选手用map存很方便
Code
#include<cstdio>#include<algorithm>#include<cstring>#include<map>#define fo(i,a,b) for(int i=a;i<=b;i++)#define N 101#define M 1234567#define ll long longusing namespace std;int n,m,a[N][N],as[M],m1,m2,bz[N],ans=214748347;ll e[N],h[M],xo[N];map<ll,int> f;void dg(int x){ if(x>m1) { int an=0; ll jy=0; fo(i,1,m1) if(bz[i]) jy^=xo[i],an++; an++; if(f[jy]!=0) f[jy]=min(f[jy],an); else f[jy]=an; return; } bz[x]=1;dg(x+1); bz[x]=0;dg(x+1);}void dg1(int x){ if(x>m2) { int an=0; ll jy=0; fo(i,m1+1,m2) if(bz[i]) jy^=xo[i],an++; if(f[e[n]-1-jy]!=0) ans=min(ans,an+f[e[n]-1-jy]-1); return; } bz[x]=1;dg1(x+1); bz[x]=0;dg1(x+1);}int main(){ scanf("%d%d",&n,&m); fo(i,1,m) { int x,y;scanf("%d%d",&x,&y); a[x][++a[x][0]]=y; a[y][++a[y][0]]=x; } e[0]=1;fo(i,1,36) e[i]=e[i-1]*2ll; fo(i,1,n) { ll jy=e[i-1]; fo(j,1,a[i][0]) jy+=e[a[i][j]-1]; xo[i]=jy; } m1=min(18,n);m2=n; f[0]=1; dg(1); dg1(m1+1); printf("%d",ans);}
阅读全文
1 0
- 2017.07.05【NOIP提高组】模拟赛A组 灯
- 2017.07.05【NOIP提高组】模拟赛A组 邮递员
- 【初中部 NOIP提高组 】模拟赛A
- {小结}2017.07.07【NOIP提高组】模拟赛A组
- 【jzoj5285】【NOIP提高组模拟赛A组8.16】【排序】
- 2017.08.25【NOIP提高组】模拟赛A组
- 2016.1.26【初中部 NOIP 提高组 】模拟赛 A
- 2016.3.5【初中部 NOIP提高组 】模拟赛A
- 2016.5.21【初中部 NOIP提高组 】模拟赛A 总结
- 2016.5.21【初中部 NOIP提高组 】模拟赛A 总结
- 2016.09.03【初中部 NOIP提高组 】模拟赛A总结
- 2017.07.05【NOIP提高组】模拟赛B组小结
- 2017.07.07【NOIP提高组】模拟赛A组 的总结
- 2017.06.05【NOIP提高组】模拟赛A组 & B组
- 2017.05.28【NOIP 提高组】模拟赛
- NOIP提高组A组7.7模拟总结
- NOIP提高组A组7.8模拟总结
- JZOJ5281. 【NOIP提高组模拟A组8.15】钦点
- JS new本质
- js原生学习-初级-练习9
- 利用js实现百度贴吧自动顶贴和盖楼
- Hadoop NameNode 高可用 (High Availability) 实现解析
- 汪国新、杨春光、谢芳、张目、张连文、郑桂兰、陈铎、蒋昌建、王迎庆、张丰毅、赵岩松等参加第八届中国
- 2017.07.05【NOIP提高组】模拟赛A组 灯
- JVM启动参数
- More than React(一)为什么ReactJS不适合复杂交互的前端项目?
- 满江红·长江 汪国新 2017年7月
- 【怎样写代码】实现对象的复用 -- 享元模式(四):享元模式与字符串
- ubuntu 12.04 upgrade后 chrome 崩溃 报Aw, Snap!
- Uva12627
- Python学习笔记(二)——基础语法
- 来来来,随老夫撸一个支付宝玩玩——自定义Behavior的正确打开方式