Problem Solving/Topcoder

[Topcoder] SRM419 DIV2

끄적끄적 2008. 9. 25. 13:47
오늘 오전 10시에 있었던 매치.
회사에서 소음때문에 하지말까 하다 참가했다.

250과 500문제는 쉽게 해법을 생각해 냈고,
1000은 문제파악부터 어렵더니.. 입력값 받아오는거부터 버벅거려서 걍 포기했다;

500문제를 같은 방에 있는 사람들이 다들 좀 이상하게 푼거 같아서 Challenge를 좀 해봤다.
3명 성공, 3명 실패.. 근데 실패한 3명도 system test에서는 죄다 fail 나더라;
( 입력값만 잘 골랐어도 다 잡는건데 ㅡㅡㅋ)

생각보다 500에서 많이들 떨어져서 방에서 1등, DIV2 전체 25등..ㅋㅋ; 요즘은 방에서 1등아니면 꼴등이구만;

250
: 평이한 문제인듯..

class ColumnDiagramPerimeter
{
public:

    int getPerimiter(vector <int> a)
    {   
        int n = a.size();
        int ret = 2 * n;

        ret += a[0];
        for(int i = 1; i<a.size(); i++)
        {
            ret += abs(a[i] - a[i-1]);
        }
        ret += a[n-1];


        return ret;
    }
};


500
undo가 될 애들을 can vector에 담는 방법으로 구했다. 쉽게 하기 위해 뒤집어서 뒤에서 부터 검색함.

class Undo
{
public:

    string getText(vector <string> c, vector <int> t)
    {   
        reverse(ALL(t));
        reverse(ALL(c));

        int n = t.size();

        VI can(n, 1);

        string ret;
        string a;
        int b;
        for(int i = 0; i < n; i++)
        {
            if(c[i].substr(0, 4) == "undo" && can[i] == 1)
            {
                can[i] = 0;
                istringstream in(c[i]);
                in >> a >> b;

                for( int j=i+1; j<n; j++)
                {
                    if( t[i]-b <= t[j] ) can[j] = 0;
                }
            }
        }

        REP(i, n)
        {
            if(can[i] == 1)
            {
                char c1;
                istringstream in1(c[i]);
                in1 >> a >> c1;
                ret += c1;
            }
        }
        reverse(ALL(ret));
        return ret;
    }
};
반응형