2009-05-06 21:58:16來源不明

ACM 11032 11032 - Function Overloading

作法:建表
想法:1.一個建各位數字+自己會有的值
    2.另一個建個數(累加) 之後就可以用扣的

此題記憶體開放比較大 安心的開1000萬的int

/**********************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[10000062][2]={0};
main()
{
 int x1,x2,x3,x4,x5,x6,x7,x8;
 for(x1=0;x1<10;x1++)
   for(x2=0;x2<10;x2++)
     for(x3=0;x3<10;x3++)
       for(x4=0;x4<10;x4++)
        for(x5=0;x5<10;x5++)
          for(x6=0;x6<10;x6++)
            for(x7=0;x7<10;x7++)
              {
               if(map[x7*2+x6*11+x5*101+x4*1001+x3*10001+x2*100001+x1*1000001][0]==0)
                 map[x7*2+x6*11+x5*101+x4*1001+x3*10001+x2*100001+x1*1000001][0]=x7+x6*10+x5*100+x4*1000+x3*10000+x2*100000+x1*1000000;
               if(map[x7+x6*10+x5*100+x4*1000+x3*10000+x2*100000+x1*1000000][0]==0&&x7+x6*10+x5*100+x4*1000+x3*10000+x2*100000+x1*1000000!=0)
                map[x7+x6*10+x5*100+x4*1000+x3*10000+x2*100000+x1*1000000][1]=1+map[x7+x6*10+x5*100+x4*1000+x3*10000+x2*100000+x1*1000000-1][1];
               else
                map[x7+x6*10+x5*100+x4*1000+x3*10000+x2*100000+x1*1000000][1]=map[x7+x6*10+x5*100+x4*1000+x3*10000+x2*100000+x1*1000000-1][1];
              }
  map[10000000][1]=map[9999999][1];
  int n;
  char x[100],time=0;
  while(scanf("%d",&n)==1)
    {
     getchar();
      while(n--)
      {
      gets(x);
      time++;
      int a,b,c,m=strlen(x),num1=0,num2=0;
      for(a=0;a<m;a++)
       if(x[a]<=57&&x[a]>=48)
        num1=num1*10+x[a]-48;
       else
        for(a=a+1;a<m;a++)
         if(x[a]<=57&&x[a]>=48)
          num2=num2*10+x[a]-48;
       if(num2==0) printf("Case %d: %d\n",time,(map[num1][0]==0)?-1:map[num1][0]);
       else
         {
           int ans=map[num2][1]-map[num1][1]+1;
       /*    printf("%d %d %d %d\n",map[num2][1],map[num1][1],num2,num1);*/
           if(map[num1][1]==map[num1-1][1]) ans--;
           printf("Case %d: %d\n",time,ans);  
         }
      }
    }
  return 0;
}