Problem Solving

[Topcoder] SRM304 ~ 307 연습

끄적끄적 2008. 9. 24. 17:58
SRM304 DIV2
: area/2가 아니라, i*i<area로 하는게 맞았다. 굳이 vector로 넣을 필요없이 반복돌면서 나눠서 0이면 약수임.

class RugSizes
{
public:

    int rugCount(int a)
    {   
        VI p;
        for(int i=2; i<= a/2; i++)
            if( a % i == 0 ) p.pb(i);

        int ret = 1, w, h;
        REP(i, p.size())
        {
            w = p[i];
            h = a / w;
            if(h > w) continue;
            if( w % 2 == 0 && h % 2 == 0 && w != h) continue;
            ret++;
        }
        return ret;
    }
};

SRM305 DIV2
: 무작정 코딩하다보면 경우의 수를 놓칠 수 있는 문제. 다시 풀어볼 것.

class MultiRead
{
public:

    int minCycles(string t, int p)
    {   
        int ret = 1, cnt = 1;
        for(int i=1; i<t.size(); i++)
        {
            if( t[i-1] != t[i] || t[i] == 'W' || cnt == p)
            {
                cnt = 1;
                ret++;
                continue;
            }
            cnt++;
        }

        return ret;
    }
};

SRM306 DIV2
: 좋은 문제. 나중에 다시 풀어볼 것.

class SortMachine
{
public:

    int countMoves(vector <int> a)
    {   
        VI so(a);
        sort(ALL(so));

        int index = 0;
        REP(i, a.size())
            if( a[i] == so[index]) index++;

        return a.size() - index;
    }
};

SRM307 DIV2

class BootsExchange
{
public:

    int leastAmount(vector <int> l, vector <int> r)
    {   
        for(int i=0; i<l.size(); i++ )
            if(find(ALL(r), l[i]) != r.end())
                r.erase(find(ALL(r), l[i]));

        return r.size();
    }
};
반응형