智力游戏
2015-10-11 18:35
218 查看
【Description】
whitecloth 最近迷上了一个你小时候已经玩厌了的游戏:移火柴棒。
他现在吵着要你陪他玩,你没有办法,只好写一个程序来完成这个工
作了。
你被给出了一个火柴拼成的等式,比如说下面这个:( 5 + 7 = 7 )
它显然是不成立的,但是我们可以通过移动一个其中的火柴使得它成
立。变成如下的一个等式:( 6 + 1 = 7 )
现在给出一个类似的等式,请问最少移动多少根火柴可以使得它变成
一个成立的等式。
【Input】
三个整数,表示原等式中的两个加数以及和
【Output】
一个数,表示最小移动几根火柴能使等式成立,不允许改变位数以及
符号,不要制造0 开头的数。
【Sample Input】
5 7 7
【Sample Output】
1
【Hint】
对于100%的数据,每个数在0 到999 之间
先写出一个8,把上面的7根火柴编号,则0-9都可以用着7根火柴中的某些来拼成,那么用到了状态压缩,sta[i]用一个二进制串表示由那几根火柴拼成,所以枚举两个改变后的加数,则其和也可知道,那么原来数字能拼成新数字的前提是总共的火柴数量相同,在最优的情况下不考虑一个数的总位数改变的情况,(考虑一定对,不考虑是贪心的剪枝,正确性显然),考虑一下,如果新变成的数字的某个位置上的火柴原来数字上有就不用动,如果原来数字上某个位置的火柴新数字中没有就把它拿出来,最后拿里少补在哪里,因为总的个数相同,所以一定能补出来,综上所述,只考虑需要拿走多少个,找最小值就好。题解上说注意1有两种,一种左对齐,一种右对齐,但是我没考虑也过了,应该因为数据中没有这种情况吧。
View Code
whitecloth 最近迷上了一个你小时候已经玩厌了的游戏:移火柴棒。
他现在吵着要你陪他玩,你没有办法,只好写一个程序来完成这个工
作了。
你被给出了一个火柴拼成的等式,比如说下面这个:( 5 + 7 = 7 )
它显然是不成立的,但是我们可以通过移动一个其中的火柴使得它成
立。变成如下的一个等式:( 6 + 1 = 7 )
现在给出一个类似的等式,请问最少移动多少根火柴可以使得它变成
一个成立的等式。
【Input】
三个整数,表示原等式中的两个加数以及和
【Output】
一个数,表示最小移动几根火柴能使等式成立,不允许改变位数以及
符号,不要制造0 开头的数。
【Sample Input】
5 7 7
【Sample Output】
1
【Hint】
对于100%的数据,每个数在0 到999 之间
先写出一个8,把上面的7根火柴编号,则0-9都可以用着7根火柴中的某些来拼成,那么用到了状态压缩,sta[i]用一个二进制串表示由那几根火柴拼成,所以枚举两个改变后的加数,则其和也可知道,那么原来数字能拼成新数字的前提是总共的火柴数量相同,在最优的情况下不考虑一个数的总位数改变的情况,(考虑一定对,不考虑是贪心的剪枝,正确性显然),考虑一下,如果新变成的数字的某个位置上的火柴原来数字上有就不用动,如果原来数字上某个位置的火柴新数字中没有就把它拿出来,最后拿里少补在哪里,因为总的个数相同,所以一定能补出来,综上所述,只考虑需要拿走多少个,找最小值就好。题解上说注意1有两种,一种左对齐,一种右对齐,但是我没考虑也过了,应该因为数据中没有这种情况吧。
#include<cstdio> using namespace std; int A,B,C; int sta[1002]; int w[1002]={6,2,5,5,4,5,6,3,7,6}; int p[1002]; void Pre(){ sta[0]=(1<<0)+(1<<1)+(1<<2)+(1<<3)+(1<<4)+(1<<5); sta[1]=(1<<4)+(1<<5); sta[2]=(1<<0)+(1<<5)+(1<<6)+(1<<2)+(1<<3); sta[3]=(1<<0)+(1<<5)+(1<<6)+(1<<4)+(1<<3); sta[4]=(1<<1)+(1<<6)+(1<<5)+(1<<4); sta[5]=(1<<0)+(1<<1)+(1<<6)+(1<<4)+(1<<3); sta[6]=(1<<0)+(1<<1)+(1<<2)+(1<<3)+(1<<4)+(1<<6); sta[7]=(1<<0)+(1<<4)+(1<<5); sta[8]=(1<<0)+(1<<1)+(1<<2)+(1<<3)+(1<<4)+(1<<5)+(1<<6); sta[9]=(1<<0)+(1<<1)+(1<<3)+(1<<4)+(1<<5)+(1<<6); } int TJ(int y,int x){ int cnt=0; y=sta[y]; x=sta[x]; for(int i=0;i<27;i++){ if(((1<<i)&x)&&!((1<<i)&y)) cnt++; } return cnt; } int ans=0; int main(){ Pre(); scanf("%d%d%d",&A,&B,&C); p[0]=1; for(int i=0;i<=1000;i++){ int o=i; while(o!=0){ p[i]++; o/=10; } } for(int i=10;i<=999;i++){ w[i]=w[i/10]+w[i%10]; sta[i]=(sta[i/10]<<7)+sta[i%10]; } //printf("%d %d\n",sta[1],sta[5]); ans=w[A]+w[B]+w[C]; for(int i=0;i<=999;i++){ for(int j=0;j<=999;j++){ if(p[i]==p[A]&&p[j]==p[B]&&p[i+j]==p[C]){ if(w[i]+w[j]+w[i+j]==w[A]+w[B]+w[C]){ int ls=TJ(i,A)+TJ(j,B)+TJ((i+j),C); if(ls<ans) ans=ls; } } } } // printf("%d %d\n",sta[1],sta[5]); // printf("%d",TJ(1,5)); printf("%d",ans); getchar(); getchar(); getchar(); }
View Code
相关文章推荐
- 信息安全系统设计基础第四周学习总结
- 08_面向对象【帮助文档的制作和作用、如何使用JDK提供的帮助文档、代码块概述(局部代码块,构造代码块,静态代码块)和讲解、继承】
- 遍历一次单链表,找出单链表中间的值
- 最远距离
- 航班预订系统需求说明书 3.0版
- 最远距离
- 分糖果
- Ajax 学习 - 基础学习
- 分糖果
- 图腾计数
- SQL练习题
- 图腾计数
- actionscript与javascript交互(转载)
- C语言基础之变量的命名规则、定义常量、C的数据类型
- 三色二叉树
- HDU5441 Travel 离线并查集
- mybatis13 resultMap
- [Jsoi2010]连通数
- 飞机订票系统---缺陷报告
- SO 小记