HDU 4541 Ten Googol

Ten Googol

Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 100    Accepted Submission(s): 48

Problem Description   Google的面试题向来以古怪闻名,延续自技术公司用逻辑题测试求职者的古老传统.现在我们来看看下面这题:

  面试官在房间的白板上写下6个数字:

    10,9,60,90,70,66

  现在的问题是,接下来该出现什么数字?

  想不出来了吧?不要再从数学的角度想了,把这些数字用正常的英文拼写出来:

    ten(10)

    nine(9)

    sixty(60)

    ninety(90)

    seventy(70)

    sixty-six(66)

  我们可以惊奇的发现这些数字都是按字母的多少排序的!再仔细一看:ten(10)不是唯一一个可以用3个字母拼出的数字,还有one(1),two(2),six(6);nine(9)也不是唯一一个用4个字母拼出的数字,还有zero(0),four(4)和five(5).而题目中的数字,每一个都是用给定长度的字母拼写出来的数字里最大的一个!

  现在我们回到原题:接下去该是哪个数字呢?

  我们注意到,66对应的字母长度为8(特别提醒:连接符不算在内),不管之后跟着哪个数,它都应该有9个字母,而且应该是9个字母拼出的数字里最大的。仔细找一下,你可能就会得出ninety-six(96)。不可能是100以上的数字,因为它会以one hundred开头,这已经有10个字母了。

  对于Google面试官来说,96只不过是可以接受的答案之一,另一个更好的回答是:

  100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

  也就是10的101次方,即:ten googol(有关Googol的资料可以在wiki中了解)。据说当年Google这个名字的创建也是由googol演化过来的(江湖传说肖恩拼写时老爱出错,本来想注册googol或者googolplex,结果由于手误就注册了google)。

  好了,当你解出了这道难题,面试官的下一道题目接踵而至——给你两个正整数N和M,要求你输出由N个字母组成的第M大数(我们只考虑0~99和googol级别的数字)。

注意:这里所说的“第M大数”是指从小到大的第M大,具体参见Sample  

 

Input 输入数据第一行有一个数字T,代表有T组数据。

每组数字由两个正整数N和M组成。

[Technical Specification]

1<=T<=100

3<=N<=9

1<=M<=100  

 

Output 首先输出case数(见sample),接着输出由N个字母组成的第M大数,如果没有,则输出-1。  

 

Sample Input 6 3 1 3 2 4 1 4 2 5 1 9 100  

 

Sample Output Case #1: 1 Case #2: 2 Case #3: 0 Case #4: 4 Case #5: 3 Case #6: -1  

 

Source
2013腾讯编程马拉松复赛第三场(3月31日)  

 

Recommend liuyiding       这题就是麻烦。 要数0-99的单词的字母数。   数一下0-20. 然后20以后的基本有规律的。 还有googol  就是10^10.只能和1,2,6,10搭配的。  

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <math.h>
using namespace std;

int a[]={0,3,3,5,4,4,3,5,5,4,3,6,6,
8,8,7,7,9,8,8,6
};

int num[50][200];

int main()
{
    for(int i=0;i<20;i++)num[i][0]=0;
    num[4][++num[4][0]]=0;
    for(int i=1;i<=20;i++)
    {
        num[a[i]][++num[a[i]][0]]=i;
    }
    for(int i=1;i<=9;i++)
       num[6+a[i]][++num[6+a[i]][0]]=20+i;
    num[6][++num[6][0]]=30;
    for(int i=1;i<=9;i++)
       num[6+a[i]][++num[6+a[i]][0]]=30+i;

    num[5][++num[5][0]]=40;
    for(int i=1;i<=9;i++)
       num[5+a[i]][++num[5+a[i]][0]]=40+i;

    num[5][++num[5][0]]=50;
    for(int i=1;i<=9;i++)
       num[5+a[i]][++num[5+a[i]][0]]=50+i;

    num[5][++num[5][0]]=60;
    for(int i=1;i<=9;i++)
       num[5+a[i]][++num[5+a[i]][0]]=60+i;

    num[7][++num[7][0]]=70;
    for(int i=1;i<=9;i++)
       num[7+a[i]][++num[7+a[i]][0]]=70+i;

    num[6][++num[6][0]]=80;
    for(int i=1;i<=9;i++)
       num[6+a[i]][++num[6+a[i]][0]]=80+i;

    num[6][++num[6][0]]=90;
    for(int i=1;i<=9;i++)
       num[6+a[i]][++num[6+a[i]][0]]=90+i;

    //printf("%d\n",num[3][0]);
    int n,m;
    int T;
    int iCase=0;
    scanf("%d",&T);
    while(T--)
    {
        iCase++;
        printf("Case #%d: ",iCase);
        scanf("%d%d",&n,&m);
        if(n==9)
        {
            if(m>4+num[9][0])
            {
                printf("-1\n");
                continue;
            }
            else if(m<=num[9][0])printf("%d\n",num[9][m]);
            else
            {
                printf("%d",num[3][m-num[9][0]]);
                for(int i=0;i<100;i++)printf("0");
                printf("\n");
            }
        }
        else
        {
            if(m>num[n][0])printf("-1\n");
            else printf("%d\n",num[n][m]);
        }
    }

    return 0;
}

 

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/kuangbin/archive/2013/03/31/2992411.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞