题解

166 条题解

  • -1
    @ 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;

    }
    枚举,可优化

  • -1
    @ 2009-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

  • -2
    @ 2015-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;
    }

  • -2
    @ 2015-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.

  • -2
    @ 2014-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;
    }

  • -2
    @ 2014-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.

信息

ID
1496
难度
3
分类
搜索 点击显示
标签
递交数
6085
已通过
2979
通过率
49%
被复制
17
上传者