P1149 火柴棒等式

来源:互联网 发布:家居设计软件手机 编辑:程序博客网 时间:2024/06/11 04:32

强行使用DFS

一次AC! 爽

题目:

给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:
注意:
加号与等号各自需要两根火柴棍
如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)

n根火柴棍必须全部用上

输入样例#1:
样例输入1:
14
样例输入2:
18

输出样例#1:
样例输出1:
2
样例输出2:
9

分析

  • 最多24根火柴棍,减去加号等号所使用的 共20根,可以摆出10个2..
    • 所以 大概最大的数字在 10/3 。 n大概为1000级别
    • 前两个数字需要枚举,最后一个数字可以相加求得,所以时间复杂度应该是 O(n^2).
  • 使用两个循环嵌套就可以。 但是为了试试dfs 强行用了嵌套来做。 其实都一样。。
  • 列出0-9所需要的火柴棍数就可以, 之后把数字不断除十、取余得到每个数字所需的火柴数。
  • 暴力求解 QAQ

代码1(用了800+ms) :

#include<iostream>#include<string>using namespace std;int n,sum[3],total;int need[20]={6,2,5,5,4,5,6,3,7,6,8,4,7,7,6,7,8,5,9,8};int panduan(int num){    int sumsum=0;    if(num==0) return 6;    while (num/10 !=0 || num%10 !=0){        sumsum+=need[num%10];        num=num/10;    }    return sumsum;}int dfs(int step){    if(step==2){        if(panduan(sum[0])+panduan(sum[1])+panduan(sum[0]+sum[1])==n){            total++;        //  cout<<sum[0]<<" "<<sum[1]<<" "<<sum[0]+sum[1]<<"  - ";        //  cout<<panduan(sum[0])<<" "<<panduan(sum[1])<<" "<<panduan(sum[0]+sum[1])<<endl;        }           return 0;    }    for(int i=0;i<1000;i++){        sum[step]=i;        dfs(step+1);    }    return 0;   }int main(){    cin>>n;    n=n-4;    dfs(0);    cout<<total<<endl;}

代码2(only 62ms)

先打表,统计1-3000的数字所需的火柴数,然后直接调用。

#include<iostream>#include<string>using namespace std;int n,sum[3],total,biao[3000];int need[20]={6,2,5,5,4,5,6,3,7,6,8,4,7,7,6,7,8,5,9,8};int panduan(int num){    int sumsum=0;    if(num==0) return 6;    while (num/10 !=0 || num%10 !=0){        sumsum+=need[num%10];        num=num/10;    }    return sumsum;}int dfs(int step){    if(step==2){        if(biao[sum[0]]+biao[sum[1]]+biao[sum[0]+sum[1]]==n){            total++;            //  cout<<sum[0]<<" "<<sum[1]<<" "<<sum[0]+sum[1]<<"  - ";        //  cout<<biao[sum[0]]<<" "<<biao[sum[1]]<<" "<<biao[sum[0]+sum[1]]<<endl;        }                   return 0;    }       for(int i=0;i<1000;i++){        sum[step]=i;        dfs(step+1);    }    return 0;   }int main(){    cin>>n;    for(int i=0;i<3000;i++)    {        biao[i]=panduan(i);    }    n=n-4;    dfs(0);    cout<<total<<endl;}

总结:

  • 其实并不会达到1000. 最大为711. 如果特别想控制时间,就先设一个较大的数,然后研究一下最小是多少!
  • # 爽!
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 针织衫袖口松了怎么办 宝宝裤子腰大了怎么办 两岁了头发稀少怎么办 孩子抵抗力差爱生病怎么办 三岁宝宝总生病怎么办 冬天穿伴娘服冷怎么办 白衬衣粘了黑毛怎么办 黄衣服钻进黑毛怎么办 单位没给上社保怎么办 轮毂中心孔大了怎么办 钻戒大了怎么办小窍门 shift加f4没反应怎么办 多洗联系不上怎么办 弹力靴筒往下掉怎么办 子宫内膜厚月经停不了怎么办 雪纺衣服有静电怎么办 阿胶糕熬的稀了怎么办 感冒吃了阿胶糕怎么办 身上起湿疹很痒怎么办 身上起小疹子痒怎么办 吊带裙带子断了怎么办 裙子洗完缩水了怎么办 衬衫洗后缩水了怎么办 羊毛被洗缩水了怎么办 蕾丝洗后缩水了怎么办 天丝针织衫缩水怎么办? 氨纶面料起球怎么办? 新买的衬衫很硬怎么办 孕晚期睡不好觉怎么办 全棉衣服缩水了怎么办 棉麻的衣服起球怎么办 布艺沙发起球怎么办 加绒的衣服掉毛怎么办 新裤子有刺鼻味怎么办 新买鞋子味道大怎么办 天窗下水管堵了怎么办 雪纺衬衫染色了怎么办 雪纺衣服染色了怎么办 漂白后衣服变黄怎么办 用84泡衣服变红怎么办 84腐蚀过的衣服怎么办