星象仪
来源:互联网 发布:js数值转换成字符串 编辑:程序博客网 时间:2024/06/09 18:30
【题目描述】
在寂寞的夜里,星象仪是非常浪漫的东西。但是,你作为一个精神稍微有点不太正常的Geek,把原本正常的星象仪改造得像电报发送器一样。当然,你这个的构造还要更加奇葩一点。具体来说,你的星象仪是一棵满二叉树,二叉树的节点都是有两个输入端和一个输出端的AND 门或者OR 门。它们输入和输出的信号都是只是0 或者1。它们会接受子节点的输出信号,然后将这两个信号进行AND 运算或者OR 运算作为自己的输出。然后,根节点的输出信号就是整个星象仪的输出信号。叶节点的输入信号是由你来调整的,如果二叉树有K 层,那么你显然有2K 个输入信号可以调整。调整一次当然只能改变一个输入信号。如左图所示,这就是一台你改造过之后的星象仪。根据你的设定,在一开始所有的输入端的输入信号都是0。现在你希望用星象仪得到一串信号,为此,你需要不停地调整输入。假定你想要用左图中的星象仪得到输出信号000111,一种可行的方案是0001→0011→1100→1111→1010→0101,但是这样你要调整14 次输入信号。更加方便的方式是0000→0000→0000→0101→0101→0101,这样你总计只需要调整2次输入信号。由于调整输入信号是一件非常麻烦的事情,现在你希望知道对于一台给定的星象仪,如果想要得到一串给定的信号,至少需要调整多少次输入。
【输入格式】
输入文件包含多组测试数据。第一行有一个整数T,表示测试数据的组数。
测试数据的第一行是一个正整数 N,表示输入信号的数目。保证N 是2 的整数次幂。
第二行含有一个由 0 和1 组成的字符串S,表示你想要得到的信号。
第三行包含 N – 1 个整数,按照层次遍历顺序给出满二叉树的每个节点。整数只会是0
或者1。0 表示二叉树的这个位置是一个OR 门,1 表示是一个AND 门。
【输出格式】
对于每组测试数据,在单独的一行内输出结果。
【样例输入】
2
4
010101
0 0 0
4
111111
1 1 1
【样例输出】
5
4
【数据范围与约定】
对于30% 的数据,N≤16,S 的长度在100 之内。
对于 100% 的数据,T≤100,N≤8192,S 的长度在10000 之内。
上午没做这个题 感觉暴力也没法暴力
甚至想到这个是图论 找到一条从0到1到0到1......的最短路
下午才想到 一开始根节点肯定是0
从0到1的最小步数可以求得
假设为k步
那么第k-1步时 根节点输出还是0
也就是说 从此往后 1变成0 0变成1 代价都是1
那么关键就在求从初始状态到1的最小步数上了(如果数列中要求输出1的话)
可以用树状dp做 听简单的dp 就是很难想到
#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;int s[16444];int g[16444];int q[16444];int top;int m,a,b,c,z;int casenum,bu;string str;int findmin(int i,int out){ if(i*2>m) { if(s[i]==0&&out==1)return 1; if(s[i]==1&&out==1)return 2; return 0; } int ret=0; if(out==1) if(s[i]==1)return findmin(i<<1,1)+findmin(i<<1|1,1); else { ret=findmin(i<<1,1)+findmin(i<<1|1,0); ret=min(ret,findmin(i<<1,0)+findmin(i<<1|1,1)); return ret; } return 0;} int work(){ int a,ret=0; top=1; q[1]=0; for(a=0;a<str.length();a++) { if(str[a]-'0'!=q[top]) { top++; q[top]=str[a]-'0'; ret++; } } if(ret!=0)ret+=bu; ret--; return ret;} int main(){ freopen("pla.in","r",stdin); freopen("pla.out","w",stdout); scanf("%d\n",&casenum); while(casenum) { casenum--; scanf("%d\n",&m); m--; cin>>str; for(a=1;a<=m;a++)scanf("%d\n",&s[a]); bu=findmin(1,1); cout<<work()<<endl; } return 0;}
- 星象仪
- 【树状DP】星象仪
- 星象学相位之详解
- 中国古代天文星象学的入门书:《步天歌》
- 徘徊于斗牛之间 —— 星象、星宿与星座(风水)
- 导航仪
- ActiveX控件 姿态仪 高度仪 水平仪...
- 关于示波器扩充仪
- 简易频谱分析仪
- 母仪天下
- 随机数生成仪
- 工业电导率仪
- 逻辑分析仪
- 血细胞分析仪
- 加速度计、螺旋仪
- 溥仪趣事
- 数字式三用表校验仪
- 矢量网络分析仪原理
- UTC和GMT时间
- 黑马程序员-面向对象(继承与多态)
- Linux find 用法示例
- ajax请求在ATG中的使用
- Android 多分辨率屏显设计及其兼容性测试
- 星象仪
- 连号区间数(蓝桥13年B组题)
- 如何解决Form表单的重复提交
- UITableView性能优化
- poj 2425 A Chess Game_sg函数
- cygwin中sshd服务不能启动的解决方法
- Qt生成有图标的.exe文件
- STL中hashtable,hashset,hashmap,set,map,multiset和multimap的区别
- muParser公式库使用简介