1 条题解

  • 0
    @ 2025-8-24 21:21:32

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar King_and_Grey
    念念不忘,必有回响||一只软趴趴的猫||追寻风的足迹||QAQ//AFOed???谁玩了我的florr,私,谢谢

    搬运于2025-08-24 21:21:31,当前版本为作者最后更新于2025-02-04 20:42:10,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P1149 [NOIP 2008 提高组] 火柴棒等式 题解

    题目简述

    一共有 nn 根火柴,求能拼出多少个 A+B=CA + B = C,且 ABA \neq B

    思路讲解

    刚刚看到这道题,毫不犹豫地打气暴力枚举,毕竟,暴力出奇迹吗。

    首先,先把 090 \sim 9 所以数字所需要的火柴数记录到一个数组中。如何三重循环 1101 \sim 10,火柴数相加等于 nn,并且 A+B=CA + B = C

    暴力代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    const int maxn = 2e4;
    const int num[] = {0,6,2,5,5,4,5,6,3,7,6};
    int n,ans;
    signed main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0),cout.tie(0);
    	cin >> n;
    	for(int i = 1;i <= 10;i++){
    		for(int j = 1;j <= 10;j++){
    			for(int k = 1;k <= 10;k++){
    				if(i + j == k && num[i] + num[j] + num[k] + 4 == n && i != j){
    					ans++;
    				}
    			}
    		}
    	}
    	cout << ans << endl;
    	return 0;
    }
    

    20 分提交记录。

    这是为什么呢。很简单,这个操作只能进行 1010 以内的加法计算。我们需要再建立一个数组,存下 120001 \sim 2000 的数字火柴数,然后暴力。

    注意点:

    1. 1212 行记得 jj 一定要大于 00.
    2. 16161717 两行 iijj 只能循环到 10001000,不然报错。
    3. 第四行,我一不小心在 66 之前 加了个 00
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2000;
    const int num[] = {6,2,5,5,4,5,6,3,7,6};
    int n,ans,a[maxn + 5];
    signed main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0),cout.tie(0);
    	cin >> n;
    	a[0] = 6;                                         //数字 0 有 6 个火柴
        for (int i = 1;i <= 2000;i++){
            for (int j = i;j;j /= 10){                    //从最高位开始,一个数位一个数位地加上火柴数
                a[i] += num[j % 10];
            }
        }
        for (int i = 0;i <= 1000;i++){
            for (int j = 0;j <= 1000;j++){
                if (a[i] + a[j] + a[i + j] + 4 == n){    //a[i] 就是第一个数,a[j] 就是第二个数。
                    ans++;                               //a[i + j]就是第三个数。加上的 4 就是 + 和 =。
                }
            }
        }
    	cout << ans << endl;
    	return 0;
    }
    

    提交记录。

    感谢观看,求赞。

    • 1

    信息

    ID
    151
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者