首页 > 其他分享 >P1149 [NOIP2008 提高组] 火柴棒等式

P1149 [NOIP2008 提高组] 火柴棒等式

时间:2024-02-18 16:11:07浏览次数:27  
标签:10 int 样例 NOIP2008 num 等式 火柴 P1149

[NOIP2008 提高组] 火柴棒等式

题目描述

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

注意:

  1. 加号与等号各自需要两根火柴棍;
  2. 如果 \(A\neq B\),则 \(A+B=C\) 与 \(B+A=C\) 视为不同的等式(\(A,B,C\geq0\));
  3. \(n\) 根火柴棍必须全部用上。

输入格式

一个整数 \(n(1 \leq n\leq 24)\)。

输出格式

一个整数,能拼成的不同等式的数目。

样例 #1

样例输入 #1

14

样例输出 #1

2

样例 #2

样例输入 #2

18

样例输出 #2

9

提示

【输入输出样例 1 解释】

\(2\) 个等式为 \(0+1=1\) 和 \(1+0=1\)。

【输入输出样例 2 解释】

\(9\) 个等式为

\(0+4=4\)、\(0+11=11\)、\(1+10=11\)、\(2+2=4\)、\(2+7=9\)、\(4+0=4\)、\(7+2=9\)、\(10+1=11\)、\(11+0=11\)。

noip2008 提高第二题

2.题解

2.1 错误思路:子集枚举

思路

思路错误在只考虑到了每个数位数都是1的情况,然后利用子集枚举选取两个(有重复),三个(无重复)的情况分别进行讨论,若满足条件ans++
但是对于可能存在的两位数情况,过于繁多,无法进行有效讨论,最后废弃

代码

#include <iostream>
using namespace std;

// 定义每个数字所需的火柴棍数量
int matchsticks[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};

// 函数用于计算数字num所需的火柴棍数量
int countMatchsticks(int num) {
    if (num == 0) return matchsticks[0];
    int count = 0;
    while (num > 0) {
        count += matchsticks[num % 10];
        num /= 10;
    }
    return count;
}

int main() {
    int n;
    cin >> n;

    int totalMatches = 0;
    // 统计总共拥有的火柴棍数量
    for (int i = 0; i <= 1000; ++i) {
        totalMatches += countMatchsticks(i);
    }

    int count = 0;
    // 枚举所有可能的等式
    for (int i = 0; i <= 1000; ++i) {
        for (int j = 0; j <= 1000; ++j) {
            int k = i + j;
            // 如果三个数所需的火柴棍数量之和等于n减去加号和等号的火柴棍数量
            if (countMatchsticks(i) + countMatchsticks(j) + countMatchsticks(k) == n - 4) {
                ++count;
            }
        }
    }

    cout << count << endl;

    return 0;
}

2.2 循环枚举

思路

我上面只考虑了[0,9]几个数组成所需的火柴数,我若是能通过题给范围 0 <= n <= 24, 判断出能组成的最大数是多少,通过循环枚举将范围内所有数所需的火柴数记录下里,再进行判断即可。
考虑极端情况:要使一个数最大,那么另一个加数消耗的火柴数肯定越少越好,同时组成的新的和肯定也要消耗火柴越少越好。
除去我们 + 和 = 所需的四个火柴 n - 4 <= 20

// 定义每个数字所需的火柴棍数量
int matchsticks[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
这里我们观察一下,发现数字1消耗的火柴数最少,所以选择的加数为 1(1111可作为加数也可以作为和),而另一个加数经过判断 20 < 1111 + 1 = 1112(21根火柴) < 1110 + 1 = 1111(22根) 均刚好超过了20根火柴,实际上不会有比这消耗更少火柴棒的情况了,所以只需要讨论[0,1111]内的数即可

代码

#include <iostream>
using namespace std;

// 定义每个数字所需的火柴棍数量
int matchsticks[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};

// 函数用于计算数字num所需的火柴棍数量
int countMatchsticks(int num) {
    if (num == 0) return matchsticks[0];
    int count = 0;
    while (num > 0) {
        count += matchsticks[num % 10];
        num /= 10;
    }
    return count;
}

int main() {
    int n;
    cin >> n;

    int totalMatches = 0;
    // 统计总共拥有的火柴棍数量
    for (int i = 0; i <= 1111; ++i) {
        totalMatches += countMatchsticks(i);
    }

    int count = 0;
    // 枚举所有可能的等式
    for (int i = 0; i <= 1111; ++i) {
        for (int j = 0; j <= 1111; ++j) {
            int k = i + j;
            // 如果三个数所需的火柴棍数量之和等于n减去加号和等号的火柴棍数量
            if (countMatchsticks(i) + countMatchsticks(j) + countMatchsticks(k) == n - 4) {
                ++count;
            }
        }
    }

    cout << count << endl;

    return 0;
}

标签:10,int,样例,NOIP2008,num,等式,火柴,P1149
From: https://www.cnblogs.com/trmbh12/p/18019467

相关文章

  • 单调队列优化DP&斜率优化&四边形不等式
    在本文中,我们将通过一道题来浅谈DP优化三大妈。P3195[HNOI2008]玩具装箱-洛谷|计算机科学教育新生态(luogu.com.cn)对于这种类型的题目,我们一般可以转化为如下形式:那么,$val(i,j)$又通常分为两种情况:其值仅与$i,j$中的一个有关。其值与$i,j$两者都有关。单调队列......
  • [NOIP2008 提高组] 笨小猴
    [NOIP2008提高组]笨小猴来自洛谷:[https://www.luogu.com.cn/problem/P1125]Openjudge:[http://noi.openjudge.cn/ch0109/06/]普及难度,其实不难。我们先审题.设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数第一行输入字符串,......
  • 洛谷题单指南-暴力枚举-P1149 [NOIP2008 提高组] 火柴棒等式
    原题链接:https://www.luogu.com.cn/problem/P1149题意解读:计算符合A+B=C时,火柴棍数量正好等于n,可以采用枚举A、B,然后计算出C,根据A、B、C计算出所有火柴棍数量,再加上4根加号、等号的,如果与n相等,即为一种合法等式。解题思路:题目的关键在于枚举A、B时,最大值的设定,不能超时。分析......
  • 均值不等式
    简述:在经过碰壁→看答案不知所谓→和大佬交流→沉淀(雾)得出了一些神秘结论,在这里分享给大家。一.发现问题寒假作业六均值不等式极其应用填空题\(7\)在做这道题的时候,我列出了一个式子\(a*\sqrt{b^2+1}\leq\frac{(a+\sqrt{b^2+1})^2}{4}\)这个式子很显然是正确的,但想一想......
  • P1125 [NOIP2008 提高组] 笨小猴
    1.题目介绍[NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设\(\text{maxn}\)是单词中出现次数最多的字母的出现次数,\(\text{......
  • 解等式方程,涉及要求出整数解
    问题描述小QQ今天做了最大公约数的题目,给定两个正整数a和b(a>b),用辗转相除很快就能得到a和b的最大公约数c,他做完心情大爽。小QQ跑去他的好朋友RED那里炫耀,但是RED告诉他,c可以用a*x+b*y=c表示,当x为正且最小时,表达式a*x+b*y=c是唯一的。小QQ想在RED面前表现一把,他夸下海口,......
  • dp优化-决策单调性 / 四边形不等式
    前言这种优化我以前“听”过了很多次,但是好像都没学会qwq。四边形不等式:对于二元组\(w_{x,y}\),如果在定义域上任取四个点\(a\leb\lec\led\),满足:\[w_{a,b}+w_{c,d}\gew_{a,c}+w_{b,d}\]则称\(w_{x,y}\)满足四边形不等式。你会想这鬼东西怎么记?反正我也不想记。......
  • [Luogu] P1058 [NOIP2008 普及组] 立体图
    P1058[NOIP2008普及组]立体图模拟赛时候要是做出来这题就能拿饮料了:(题目传送门思路先打个输出长方体的函数:(其中\((x,y)\)表示该长方体的左上角)voiddraw(intx,inty){c[x][y+2]='+';c[x][y+6]='+';c[x+2][y]='+';c[x+2][y+4]='+';c[x+5][y]='+';c[x+5]......
  • <学习笔记> 四边形不等式
    四边形不等式对于任意的\(l_1\lel_2\ler_1\ler_2\),满足\(w(l_1,r_1)+w(l_2,r_2)\lew(l_1,r_2)+w(l_2,r_1)\)。若等号恒成立,则称函数\(w\)为四边形恒等式。如何证明若满足\(w(l,r-1)+w(l+1,r)\leqw(l,r)+w(l+1,r-1)\),则\(w\)满足四边形不等式。决策单调......
  • 复杂一点的四边形不等式和邮局
    四边形不等式不仅在一维的线性dp中可以使用,在二维dp中也是很不错的东西这个二维dp不局限于区间dp,虽然四边形不等式优化石子合并是很经典的东西但是这种四边形不等式我不打算推导,而是直接背结论,因为我觉得知道推导过程对我的作用不是很大而且麻烦在区间dp问题中,这样的方程\(f[i]......