1 solutions
-
0
这道题主要还是要处理好细节,按照题意一步一步来就没什么问题了。 首先我们要把从0~9这10个数字所需要的火柴通过数组来进行储存。
int a[N]={6,2,5,5,4,5,6,3,7,6}; int a[N]={6,2,5,5,4,5,6,3,7,6};int a[N]={6,2,5,5,4,5,6,3,7,6}; int a[N]={6,2,5,5,4,5,6,3,7,6};
并且我们需要10~1000这些数所需要的火柴,这就要把数拆分成一位一位的来进行火柴计算
for(int i=10;i<100000;i++){ int p=i; while(p>9){ int m=p%10; a[i]+=a[m]; p/=10; } a[i]+=a[p]; }
然后我们就可以看到他是加号和等号也是需要火柴的(这里就直接记上,”+“需要2根,“=”也是需要两根,这里特别注意还有“==”这是需要4根火柴的),这里A+B=C,与B+A=C是不同的两个等式,那么我们就要注意当A与B不一样的时候,我们就要交换AB的位置,就又可以成为一个新的等式,所以直接乘2。
这里tt是表示所拥有的火柴中减去ABC还有+号和一个”=“所剩下的火柴,这里就要对”=“和”“来进行特别处理,如果还剩2个以上,那么就可以用”“表示来那么我们就直接加2种方案,如果A和B不同那我们再加2种方案。如果剩下的不足摆出”==“那我们就只有加’=‘的一种方案。
if(tt>=2) { //cout<<i<<"+"<<j<<"=="<<i+j<<endl; if(i!=j) ans+=2; ans+=2; }else if(tt>=0){ //cout<<i<<"+"<<j<<"="<<i+j<<endl; if(i!=j) ans++; ans++; }
因为A和B都是到1000所以可以直接循环来找。 最终代码:
#include<iostream> #include<cstdio> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<algorithm> #include<stack> #include<queue> #define lowbits(x) ((-x)&x) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+5; typedef long long ll; int gcd(int a,int b) { return b>0 ? gcd(b,a%b):a; } int a[N]={6,2,5,5,4,5,6,3,7,6}; int main() { ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int n,ans=0; cin>>n; for(int i=10;i<100000;i++){ int p=i; while(p>9){ int m=p%10; a[i]+=a[m]; p/=10; } a[i]+=a[p]; } for(int i=0;i<1000;i++){ for(int j=i;j<1000;j++){ int tt=n; tt-=4+a[i]+a[j]+a[i+j]; //if(i==71&&j==71) cout<<tt<<endl; if(tt>=2) { //cout<<i<<"+"<<j<<"=="<<i+j<<endl; if(i!=j) ans+=2; ans+=2; }else if(tt>=0){ //cout<<i<<"+"<<j<<"="<<i+j<<endl; if(i!=j) ans++; ans++; } } } if(ans>0)cout<<ans; else cout<<-1; return 0; }
Information
- ID
- 6638
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- (None)
- # Submissions
- 57
- Accepted
- 12
- Uploaded By