算法1
(暴力枚举) $O(n^2)$
1 是 0~9中用火柴棍最少的一个数,考虑极限情况,1111会用掉8根火柴棍,如果a=1111,b=1111则会用掉16根,加号和等号各用掉2根,易知1111就是本题的极限值,枚举0~1111判断是否满足题目要求即可。
C++ 代码
#include <iostream>
using namespace std;
int d[11] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int main(){
int m, n, ans = 0;
cin >> m;
m -= 4;
for(int a = 0; a <= 1111; a++){
n = m;
if(a == 0) n -= d[0];
else {
int t = a;
while(t){
n -= d[t % 10];
if(n < 0) break;
t /= 10;
}
}
for(int b = 0; b <= 1111; b++){
int nn = n;
if(b == 0) nn -= d[0];
else {
int t = b;
while(t){
nn -= d[t % 10];
if(nn < 0) break;
t /= 10;
}
}
int c = a + b;
if(c == 0) nn -= d[0];
else {
int t = c;
while(t){
nn -= d[t % 10];
if(nn < 0) break;
t /= 10;
}
}
if(nn == 0) ans++;
}
}
cout << ans << endl;
return 0;
}
佬,这个极限咋来的还是不懂😂
题目说了n是火柴棍数,那么要满足:a + b = c;a,b,c是三个数字,就等价于从 一堆数中选3个数分别是a,b,c,但是一堆数的范围我们不知道,但是可以通过火柴棍拼凑出来最大的数,由于n最大是24根火柴棍,除开 += 的四根火柴,组成一个数的n最大有 20根,那么3个数,要想满足:a+b=c,则首先a,b,c的位数相同呗,两个数比较大小,位数越大数值越大,所以请问你,会如何使用这20根火柴棍?肯定是 组成位数尽可能多的数?由于1只需要两根火柴棍,所以拿20根火柴棍子去组成多个1就行了呗。然后就是3个数了,我们知道每个数应该尽可能的每位都是1,位数相等,数值上才有可能相等,所以三个数平分20根火柴棍,20/3 = 6.6呗,由于一个1要两根棍子所以每个数最多3个1,而他这里讨论的是4个1,应该是没考虑 += ,取范围更广的,反正也不会超时,从而保证正确性。