HDU 5867 打表

来源:互联网 发布:sql developer怎么卸载 编辑:程序博客网 时间:2024/06/05 04:18

然后这个题意也蛮简单,就是给你一个不大于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;}
0 0