Coding Issue

codejam一道题目 2009 Round1C ProA

https://code.google.com/codejam/contest/189252/dashboard#s=p0

主要bug是没有单独处理可能只有进制为1的情况,例如aaaaa这样只有一种字符,另外自己调试了很长时间,

看了大神代码之后发现自己对于字符的习惯用int数组,其实用map更简洁,处理情况要少很多,因为访问的其他地方还要单独判断。

另外就是最好化繁为简,先把进制转化好,然后一个循环就可以算出数了,之前的话边处理变算,情况多容易出错。
而且还不需要专门index映射一下,给自己找麻烦,编程复杂度降低比较好。另外就是判断进制为0不是用dig,最好用map大小,这样可以处理
进制为1时候的特殊情况

int main()
{

#ifndef ONLINE_JUDGE
    freopen ("A-small-practice.in" , "r" , stdin);
    freopen ("A-small-practice.out" , "w" , stdout);
#endif

    int t;string str;
    cin>>t;
    unordered_map<char, int> mp;
    for(int ti=1;ti<=t;ti++)
    {
        mp.clear();
        cin>>str;int n=str.size();
        vector<int> num;
        int dig=0;
        for(int i=0;i<n;i++)
        {
            if(!i) num.push_back(1), mp[str[i]]=1;
            else if(mp.find(str[i])==mp.end())
            {
                num.push_back(dig);
                mp[str[i]]=dig++;
                if(dig==1) dig=2;
            }
            else
            {
                num.push_back(mp[str[i]]);
            }
        }
        if(mp.size()==1) dig=2;
        //for(auto e: num) cout<<e<<" ";
        reverse(num.begin(), num.end());LL wei=1, sum=0;
        for(int i=0;i<num.size();i++)
        {
            sum+=num[i]*wei;wei*=dig;
            //cout<<sum<<endl;
        }
        printf("Case #%d: %I64d\n", ti, sum);
    }
    return 0;
}

Posted by richard爱闹 - 3月 20 2015
如需转载,请注明: 本文来自 Richard