USACO1.2 Name That Number 解题报告

来源:互联网 发布:淘宝标志图片大全 编辑:程序博客网 时间:2024/05/15 23:52

解题思考顺序:

Attempt:很简单的把字典读进去了顺序查找,然后又很天真的把数字用递归进行了全排列,自己在本机上实验的结果很理想。。可是悲剧的就是严重超时!

Attempt:后来试着不用递归求出全排列,貌似还是很困难的。。卡住了很久很久。。至今没有编出来,还是代码能力不行

Attempt:我在别人的解题报告中也发现了有同样超时的问题,他也试过,二分查找字典也是很慢的,同样超时。。。

Final:经过网上搜索。。突然看到作者提示,从字典出发匹配数字。这也就是枚举的难点所在!

本题体现出了枚举的难点:枚举的方式

枚举的方法决定了这次大工程的耗时情况,比方说顺序查找算法复杂度为O(5000×3^12),二分查找的复杂度为O(3^12log5000)同样有一个3^12很大的系数。后来的方法只需要O(5000×12)的复杂度。

从这一点就可以看出有的题目可以使用枚举法,但是枚举的方式特殊,需要先思考问题,并且思考问题的时候要心里记得出其不意,正反思考!

下面贴出我的程序(这也是有史以来我感觉usaco最短的程序了):


/*ID: ******PROG: namenumLANG: C++*/#include<stdio.h>#include<iostream>#include<string.h>#include<fstream>using namespace std;    FILE*fp;    int map[100],len,flag,i,FLAG=0;    char s[1000],t[1000];int main(){    map['A']=2;map['B']=2;map['C']=2;map['D']=3;map['E']=3;map['F']=3;    map['G']=4;map['H']=4;map['I']=4;map['J']=5;map['K']=5;map['L']=5;    map['M']=6;map['N']=6;map['O']=6;map['P']=7;map['R']=7;map['S']=7;    map['T']=8;map['U']=8;map['V']=8;map['W']=9;map['X']=9;map['Y']=9;    fp=fopen("namenum.in","r");    fscanf(fp,"%s",&s);    len=strlen(s);    ifstream cin("dict.txt");    ofstream cout("namenum.out");    while(cin>>t)    {        if(strlen(t)==len)        {            flag=1;            for(i=0;i<len&&flag;i++)                if(map[t[i]]!=s[i]-'0')                    flag=0;            if(flag==1)            {                FLAG=1;                cout<<t<<endl;            }        }    }    if(FLAG==0)cout<<"NONE"<<endl;    return 0;}

经过最近的一些日子不断的刷题,代码能力增进不少,从以前的几行代码都要调试,到现在30行内的不用调试,值得我自己庆祝一下的。但是还有很大的发展空间,就像有篇文章里面所说,要达到100行以内不需要调试,还是有很大的差距的。