166 条题解
-
-1linhui LV 9 @ 2015-08-24 19:11:16
#include<cstdio>
#include<algorithm>
using namespace std;int num[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int check(int x){
int ans = 0;
if(x == 0)
ans += 6;
while(x > 0){
ans += num[x % 10];
x /= 10;
}
return ans;
}int main()
{
int n, ans = 0;
scanf("%d", &n);
n -= 4;
for(int i=0; i<=1000; i++)
for(int j=0; j<=i; j++)
if(check(i) + check(j) + check(i+j) == n){
if(i != j)
ans += 2;
else
ans++;
}
printf("%d", ans);
return 0;
}
枚举,可优化 -
-12009-07-20 09:55:38@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
-22015-06-05 15:51:48@
直接将全部情况枚举即可(24根肯定拼不出2000^2级别),慢了点但肯定不超时(70ms左右吧)
#include<stdio.h>
int main( )
{
int n,i,j,t,a[10],t1,i1,j1,add=0;
a[0]=6;
a[1]=2;
a[2]=5;
a[3]=5;
a[4]=4;
a[5]=5;
a[6]=6;
a[7]=3;
a[8]=7;
a[9]=6;
scanf("%d",&n);
for(i=0;i<=2000;i++)
for(j=0;j<=2000;j++)
{
t=i+j;
if(t>=1000) t1=a[t/1000]+a[t%10]+a[t%100/10]+a[t%1000/100];
else if(t>=100) t1=a[t/100]+a[t%10]+a[t%100/10];
else if(t>=10) t1=a[t/10]+a[t%10];
else t1=a[t];if(i>=1000) i1=a[i/1000]+a[i%10]+a[i%100/10]+a[i%1000/100];
else if(i>=100) i1=a[i/100]+a[i%10]+a[i%100/10];
else if(i>=10) i1=a[i/10]+a[i%10];
else i1=a[i];if(j>=1000) j1=a[j/1000]+a[j%10]+a[j%100/10]+a[j%1000/100];
else if(j>=100) j1=a[j/100]+a[j%10]+a[j%100/10];
else if(j>=10) j1=a[j/10]+a[j%10];
else j1=a[j];if(t1+i1+j1+4==n) add++;
t1=0;i1=0;j1=0;
}
printf("%d",add);return 0;
} -
-22015-06-01 18:35:53@
我来说一个用简单枚举的思路来想这道题目的题解。
一个很简单的想法。首先我们肯定要把每个数字需要多少火柴数目才能拼出来。
很明显。0 1 2 3 4 5 6 7 8 9分别对应 6 2 5 5 4 5 6 3 7 6.
由于加和等号算4根是肯定在的。所以一开始就n=n-4;那么怎么枚举??
很显然。枚举a,b所有可能,然后验证C能不能刚好用剩下的拼够不够就好啦。
那么关键就是!a,b的范围!!我们简单分析上面的表。发现最方便能拼出来是的1.
因此很容易发现。再怎么拼。24根火柴最大也只能这么拼 1111+1=1111
显然范围立刻减少到1111。其实还可以再缩小范围。不过效果不大。而且已经满足时间复杂度了。不需要想多!!考试要把握时间
那么还能不能优化?我们发现,如果2+4=6那么必定有4+2=6.因此,我们枚举时保证b>=a,然后找到答案就ans=ans+2.
当然,如果b=a,那么ans=ans+1.可以减少1半的枚举量。这个优化可比再去优化那已经很小的枚举范围有用多了!!
因此写出如下代码。
这里计算火柴数用了字符串的特性。类似高精度。
###pascal code
program P1496;
var data:array[0..9] of longint=(6,2,5,5,4,5,6,3,7,6);
i,n,ans,j,k,sum,c2,a2,b2,sum2:longint;
a,b,c:string;
begin
read(n); n:=n-4; ans:=0; sum:=0;
for i:=0 to 1111 do
begin
sum:=0; str(i,a); for j:=1 to length(a) do sum:=sum+data[ord(a[j])-ord('0')];
if sum<n then
for k:=i to 1111 do
begin
str(k,b); sum2:=sum; for j:=1 to length(b) do sum:=sum+data[ord(b[j])-ord('0')];
if sum<n then
begin
val(a,a2); val(b,b2); c2:=a2+b2; str(c2,c);
for j:=1 to length(c) do sum:=sum+data[ord(c[j])-ord('0')];
if sum=n then
if i=k then
ans:=ans+1
else
ans:=ans+2
end;
sum:=sum2;
end;
end;write(ans);
end. -
-22014-11-01 13:10:07@
* RP 999 纪念 *
#include <stdio.h>
int matches[10]={6,2,5,5,4,5,6,3,7,6};
int matchNum(int num){
int result=0;
do{
result+=matches[num%10];
num/=10;
}while(num>0);
//分解数字每一位
return result;
}
int main(){
int num,a,b;
int numA,numB,count=0;
scanf("%d",&num);
num-=4;
for(a=0;a<=1000;a++){
numA=matchNum(a);
for(b=0;b<=1000;b++){
numB=matchNum(b);
if(numA+numB+matchNum(a+b)==num)
count++;
}
}
//枚举
printf("%d\n",count);
return 0;
} -
-22014-03-20 19:40:09@
搜毛搜 秒过
var a:array[0..24] of longint;i,j,k,s,total,n:longint;
function qie(x:longint):longint;
var f:longint;
begin
if x<=9 then begin qie:=a[x];exit;end;
qie:=0;f:=0;
while x>0 do begin f:=f+a[x mod 10];x:=x div 10;end;
qie:=f;
end;
begin
readln(n);
a[0]:=6;a[1]:=2;a[2]:=5;a[3]:=5;a[4]:=4;a[5]:=5;a[6]:=6;
a[7]:=3;a[8]:=7;a[9]:=6;total:=0;
for i:=0 to 800 do
if qie(i)<n-3 then
begin
for j:=0 to 800 do
if qie(j)<n-qie(i)-3 then
begin
s:=0;k:=i+j;s:=qie(i)+2+qie(j)+2+qie(k);
if s=n then inc(total);
end;
end;
writeln(total);readln;
end.