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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

|洛谷|搜索|NOIP2008|P1149 火柴棒等式

https://www.luogu.org/problem/show?pid=1149 /*https://www.luogu.org/problem/show?pid=1149 (NOIP提高组2...
  • Darost
  • Darost
  • 2016年12月10日 23:07
  • 310

2008NOIp提高组 火柴棒等式

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

新手村 过程函数与递归 火柴棒等式

屠龙宝刀——点击就送题意理解这题首先想到,显然有四根火柴是用来摆出“+=”的。然后观察一下这些数字分别需要多少根火柴: 数字 需要的火柴数 0 6 1 2 2 5 3...

[NOIP2008] 火柴棒等式

220. [NOIP2008] 火柴棒等式 ★   输入文件:matches.in   输出文件:matches.out   简单对比 时间限制:1 s   内存限制:128 MB 【问题描述】...
  • w00w12l
  • w00w12l
  • 2012年10月17日 20:45
  • 5722

火柴棒等式(洛谷 1149 && NOIp2008 提高组 T2 )

火柴棒等式(洛谷 1149 && NOIp2008 提高组 T2 ) 题目描述 给你 n 根火柴棍, 你可以拼出多少个形如“A+B=C”的等式? 等式中的 A、 B、 C 是用火柴棍拼出的整数( ...

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

题目概述:

1106: 火柴棒等式

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

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

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

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

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

NOIp2008 火柴棒等式

描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示: 注意: 1.  加号...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 8466 火柴棒等式(预处理+搜索)
举报原因:
原因补充:

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