Problem Solving

[Topcoder] SRM407 ~ 409 연습

끄적끄적 2008. 10. 28. 18:30
내일 SRM도 있고.. 한동안 topcoder를 못해본 거 같아 연습삼아 몇개 풀어봤다.

SRM407 DIV2
: 250점짜리 치고 좀 복잡한 문제.. 오랜만에 해서 오래걸리나 했는데.. 매치 결과에도 많이들 못푼 문제다.
나중에 다시 한번 풀어볼 것.

class SpiralWalking
{
public:

    int totalPoints(vector <string> m)
    {           
        int idx[] = { 0, 1, 0, -1 };
        int idy[] = { 1, 0, -1, 0 };
       
        vector< vector<int> > d;
        REP(i, m.size())
        {
            vector<int> sub;
            REP(j, m[0].size())
            {
                sub.pb(m[i][j]-'0');
            }
            d.pb(sub);
        }
        int i = 0, j = 0, index = 0;
        int sum = 0;

        int w = m[0].size();
        int h = m.size();

        while(1)
        {           
            if( i+idx[index] < 0 || i+idx[index] >= h || j+idy[index] < 0 || j+idy[index] >= w || d[i+idx[index]][j+idy[index]] == -1)
            {
                index = (index+1)%4;
                if(d[i+idx[index]][j+idy[index]] == -1)
                {
                    sum += d[i][j];
                    break;
                }
                i += idx[index];
                j += idy[index];
            }
            else
            {
                sum += d[i][j];
                d[i][j] = -1;       
                i += idx[index];
                j += idy[index];
            }       
        }

        return sum;

    }   
};

SRM408 DIV2

class TournamentJudging
{
public:

    int getPoints(vector <int> r, vector <int> c)
    {       
        int ret = 0;
        REP(i, r.size())
        {
            double a = r[i];
            double b = c[i];
            int s = a / b + 0.5;
            ret += s;
        }
        return ret;

    }   
};

SRM409 DIV2

class Stick
{
public:

    int pieces(int x)
    {       
        int h = 64;
        bool down = true;

        int index = 64;
        vector<int> d;
        if( x == 64) return 1;
        while(1)
        {
            if( down) index -= h/2;
            else index += h/2;
            h /= 2;
            if( index <= x ) d.pb(index);

            if( index == x ) return d.size();
            else if(index > x ) down = true;
            else if(index < x ) down = false;
           
        }
    }   
};




반응형