2 条题解
-
1
#include<bits/stdc++.h> using namespace std; long long n,s; int dx[15]={6,2,5,5,4,5,6,3,7,6}; int f(int x){ if(x<10) return dx[x]; int sum=0,c=x; while(c>0){ sum+=dx[c%10]; c/=10; } return sum; } int main(){ cin>>n; n-=4; for(int i=0;i<=1111;i++){ for(int j=0;j<=1111;j++){ int k=i+j; if(f(i)+f(j)+f(k)==n) s++; } } cout<<s; return 0; } -
0
欢迎来到小马课堂
怎么还来啦,烦死了问题分析:火柴棍拼等式问题
1. 问题描述
给定 根火柴棍,拼出形如
A+B=C的等式,其中:- 是用火柴棍拼成的整数(非零时不能有前导零)
- 加号
+和等号=各需要 根火柴棍 - 如果 ,则
A+B=C和B+A=C视为不同等式 - 所有火柴棍必须用完。
2. 关键约束条件
- 运算符固定消耗 根火柴棍(加号 根,等号 根)
- 数字拼法固定( 各需要特定数量的火柴棍)
- ,因此数字部分最多使用20根火柴棍
3. 解题思路分析
- 数字表示分析:
- 需要预先存储每个数字 的火柴棍消耗量
- 多位数消耗量是其各位数字消耗量之和。
- 等式结构分析:
- 等式形式固定为
A+B=C - 需要满足两个条件:
- 算术条件:
A + B = C - 火柴棍条件:消耗总量 。
- 算术条件:
- 等式形式固定为
- 搜索空间分析:
- 由于 ,数字部分最多消耗 根
- 可以估算 的可能取值范围:
- 单个数字最大消耗 根 数字
- 三位数最大消耗约 根如
- 实际有效范围更小。
4. 算法优化思路
- 预处理优化:
- 预先计算所有可能数字的火柴棍消耗量
- 使用动态规划或查表法避免重复计算
- 搜索策略优化:
- 合理限制 和 的枚举范围
- 利用算术关系减少搜索空间
- 可以进一步优化为单层循环枚举 ,然后计算 的范围。
- 边界条件处理:
- 前导零问题
- 的特殊处理
- 时的排列组合。
5. 复杂度分析
- 预处理阶段:, 为最大数字
- 搜索阶段:, 为有效数字范围
- 总体复杂度可控,因为 限制了数字范围。
6. 测试案例分析
- 输入 :
- 有效等式:
0+1=1和1+0=1。 - 验证:
6+2+2=10,加上运算符 根共 根。
- 有效等式:
- 输入 :
- 共 个有效组合
- 如
0+11=11:6+(2+2)+(2+2)=12,加运算符 根共 根需验证。
代码胡乱显示:
不可能让你这么轻松#include<bits/stdc++.h> #define re register #define il inline //#pragma GCC optimize(2) //#pragma GCC optimize(3,"Ofast","inline") typedef long long ll; using namespace std; const ll N=1e5+10; const ll mod=1e9+7; const ll maxn=INT_MIN; const ll minn=INT_MAX; const ll INF=0x3f3f3f3f3f; const ll E=1e-6; ll m[10]={6,2,5,5,4,5,6,3,7,6}; ll n,ans=0; il ll read() {//适用于整数,写x=read(); ll x = 0,f = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ x = (x << 3) + (x << 1); x += ch - 48; ch = getchar(); } return x * f; } il void write(ll x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); } ll cnt(ll n) { if(n==0) return m[0]; ll s=0; while(n) s+=m[n%10],n/=10; return s; } signed main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); n=read(); for(int a=0;a<=1000;++a) { for(int b=0;b<=1000;++b) { ll c=a+b; if(cnt(a)+cnt(b)+cnt(c)==n-4) { ans++; } } } write(ans); return 0; }完了,电脑没电了,不给看了。
拜拜。
- 1
信息
- ID
- 60
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 267
- 已通过
- 96
- 上传者