poj 8466 火柴棒等式(预处理+搜索)

原创 2016年05月30日 12:32:30

poj 8466 火柴棒等式(预处理+搜索)
总时间限制: 1000ms 内存限制: 65536kB

描述
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:
这里写图片描述

注意:

  1. 加号与等号各自需要两根火柴棍

  2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C≥0)

  3. n根火柴棍必须全部用上

输入
输入一个整数n(n≤24)。

输出
输出能拼成的不同等式的数目。

样例输入

5

样例输出

0

首先枚举是很不划算的,因为理论上枚举要枚举到很高位才能覆盖完全,而中间有大量数字含了多火柴棒的数字,浪费严重,所以要用搜索实现预处理,这样一定要注意0这个数字不要漏!
这是本题最大的难点,就是边界条件,一个特殊的点——0的问题,解决了这个问题很快就AC了,所以说做题目要细致。
如果细致的话,就算枚举会TLE,但是只要正确,打表也可以过。所以因为不细致十分就太可惜了,毕竟考试时间很短。

Accepted    528kB   10ms    1176 B  G++
#define MAX_M 30261

#include<stdio.h>
#include<stdlib.h>

const int num[10]={6,2,5,5,4,5,6,3,7,6};
const int ten[8]={1,10,100,1000,10000,100000,1000000,10000000};
int n,ans=0,sticks_sum,sum;
int m=1,a[MAX_M][2];

void dfs(int x,int dig,int sticks,int last)
{
    if (sticks>n-4)
        return;
    for (int i=0;i<=9;i++)
        dfs(x+i*ten[dig],dig+1,sticks+num[i],i);
    if (last)
    {
        a[m][0]=x;
        a[m][1]=sticks;
        m++;
    }
}

int compare(const void *e1,const void *e2)
{
    return ((int *)e1)[1]-((int *)e2)[1];
}

int main()
{
    scanf("%d",&n);
    a[0][0]=0;
    a[0][1]=6;
    for (int i=0;i<=9;i++)
        dfs(i,1,num[i],i);
    qsort(a,m,sizeof(int[2]),compare);
    /*
    freopen("output.txt","w",stdout);
    for (int i=0;i<m;i++)
        printf("%d %d\n",a[i][0],a[i][1]);
    */
    for (int i=0;i<m;i++)
        for (int j=0;j<m;j++)
        {
            if (a[i][1]+a[j][1]>n-6)
                break;
            sum=a[i][0]+a[j][0];
            sticks_sum=0;
            if (sum==0)
                sticks_sum=6; 
            while (sum)
    1       {
                sticks_sum+=num[sum%10];
                sum/=10;
            }
            if (a[i][1]+a[j][1]+sticks_sum==n-4)
            {
                //printf("%d(%d)+%d(%d)=%d(%d)\n",a[i][0],a[i][1],
                //  a[j][0],a[j][1],a[i][0]+a[j][0],sticks_sum); 
                ans++;
            } 
        }
    printf("%d\n",ans);
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

1106: 火柴棒等式

Description 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示: 注意...

[noip模拟]四道题 noip2008 笨小猴 noip2008 火柴棒等式 noip2008 双栈排序 noip2008 传纸条

大白兔的奶糖’s T解今天考了noip2008的真题,DP题最开始居然只过了五个点,绝望系列。最后一道题少了一句话GG了。这么简单的题260,连一等奖都拿不到。下次一定要注意,思路要严谨。大家都很强,...

青科大编程赛热身赛C题:火柴棒等式

题目概述:

[NOIP2008] 火柴棒等式

220. [NOIP2008] 火柴棒等式 ★   输入文件:matches.in   输出文件:matches.out   简单对比 时间限制:1 s   内存限制:128 MB 【问题描述】...

【NOIP2008】T2 火柴棒等式 题解

火柴棒等式 (matches.pas/c/cpp) 【问题描述】 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)...

【枚举】Vijos P1496 火柴棒等式 【NOIP2008提高组第二题】

题目链接:https://vijos.org/p/1496 题目大意:   给你n(n   如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)   n根火柴棍必须全部用上 ...

【NOIP普及组】2016年模拟考试(11.5)——火柴棒等式

一、火柴棒等式(equation.cpp) 时间限制: 1 Sec  内存限制: 128 MB 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼...

[NOIP2008]笨小猴,火柴棒等式,传纸条,双栈排序

笨小猴 (word.pas/c/cpp) 【问题描述】 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头痛。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! ...

用火柴棒搭A+B=C形式的等式

今天看了一下这本书,书中提到了一个很有意思的算法,使用火柴棒搭A+B=C;等式中A,B,C均用火柴棍拼出来的整数,数值0-9的拼法如下图所示:注意事项: 加号与等号各自需要两根火柴棍 如果A<>B,则...

火柴棒等式

一、原题题目描述给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:注意: 1. ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)