HDU 5867 打表

4 篇文章 0 订阅

然后这个题意也蛮简单,就是给你一个不大于1000的数,然后问它的英文表示有多少个字符。如342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters

然后第一反应是打表,都记录下来
其中也是有细节的,所以会WA

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
int vis[1005];
void timec()
{
    memset(vis,0,sizeof(vis));
    vis[1]=3,vis[2]=3,vis[3]=5,vis[4]=4,vis[5]=4,vis[6]=3,vis[7]=5,vis[8]=5,vis[9]=4,vis[10]=3;
    vis[11]=6,vis[12]=6,vis[13]=8,vis[14]=8,vis[15]=7,vis[16]=7,vis[17]=9,vis[18]=8,vis[19]=8;
    vis[20]=6,vis[30]=6,vis[40]=5,vis[50]=5,vis[60]=5,vis[70]=7,vis[80]=6,vis[90]=6;//不要写 vis[100]=7;
    for(int i=21;i<1000;i++)
    {
        if(vis[i]!=0) continue;//这个要注意
        int bw=i/100;
        int sw=(i%100)/10;
        int gw=i%10;
        if(bw>0)
             vis[i]=vis[bw]+7;
        if(sw>=2)//注意是2.。。因为十几的数你不是都赋值了么。如14是一个整体
          vis[i]+=vis[sw*10]+vis[gw];
        else vis[i]+=vis[i%100];
        if(bw>0&&((gw>0)||(sw>0)))
            vis[i]+=3;
    }
    vis[1000]=11;//1000别忘了
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        long long ans=0;
        timec();
        for(int i=1;i<=n;i++)
            ans+=vis[i];
        cout<<ans<<endl;
       // cout<<ans<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值