공부/Problem Solving2011/11/13 13:06
250 - 결과 Chanllenged

아침에 일어나 확인해보니 챌당했다 ㅠㅠ.. 지금까지 div1은 항상 한가지 예외처리(..)를 하지 않아서 당했었는데 일단 다시 풀어보았다.

다시푼 코드

class CountingSeries
{
public:
    bool isDuplicated(long long n, long long a, long long b){
        if(a > n) return false;
        return (n-a)%b == 0;
    }
    long long countThem(long long a, long long b, long long c, long long d, long long upperBound)
    {
        long long result = 0;
        if(a <= upperBound){
            result = (upperBound-a)/b+1;
        }
        if(d == 1){if(c <= upperBound && isDuplicated(c, a, b) == false) result++;
        }else{
            while(c <= upperBound){
                if(isDuplicated(c, a, b) == false) result++;
                c *= d;
            }
        }
 
        return result;
    
}; 

System Test통과. 엇.?


제출했던 코드를 보니.. d가 1일경우 중복처리를 안했다 orz...

class CountingSeries 
{ 
public: 
    long long countThem(long long a, long long b, long long c, long long d, long long upperBound)
    { 
        long long maxX = upperBound < a ? 0 : (upperBound-a)/b+1; 
        long long maxY = 0; 
        long long ex = c; 
        if(d == 1) maxY = upperBound >= c ? 1 : 0; 
        else{ 
            while(ex <= upperBound) 
            { 
                if(ex < a || (ex-a)%b != 0){ 
                    printf("O : %lld\n", ex); 
                    maxY++; 
                }else{ 
                    printf("X : %lld\n", ex); 
                } 
                ex *= d; 
            } 
        } 
        return maxX+maxY; 
    } 
};

저작자 표시
Posted by Mastojun
TAG SRM, Topcoder
공부/Problem Solving2011/09/20 22:34
250 WhichDay
 - 아무리 div2이지만 이렇게 쉬운 문제가 나온건 처음이였던듯한 문제.
 - 테스트 하지 않고 바로 제출할껄 하는 아쉬움이...
 - 결과 246.65
class WhichDay 
{ 
public: 
    string getDay(vector <string> notOnThisDay) 
    { 
        string day[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",  "Friday", "Saturday"};
         
        bool isFound; 
        for(int i = 0; i < 7; i++) 
        { 
            isFound = false; 
            for(int j = 0; j < notOnThisDay.size(); j++) 
            { 
                if(notOnThisDay[j] == day[i]) isFound = true; 
            } 
            if(isFound == false) 
            { 
                return day[i]; 
            } 
        } 
        return ""; 
    } 
};

600 - ThreeTeleports
 - 500점이 아닌 600점이길래 어려울꺼라 생각했는데, 중간에 경유할수 있는 텔레포트가 3개로 제한되어 있고 가장 빠른길은 텔레포트를 몇개를 거치는지, 어떤 순서로 거치는지, 어디가 시작점이고 어디가 끝점인지 여부가 중요하므로 이를 선택하는 전략을 정하는게 주요한 문제였는데, 모든 경우의 수를 다 계산해도 3*2+3*2*2*2+3*2*2*2*1*2 밖에 안되므로 모든경우를 다 만들어 돌려봄.
 - 처음 코딩할때 시작점과 끝점을 어떻게 정하느냐에 따라 경우의수가 나뉘어 진다는것을 생각못해 좀 더 걸림.
 - 가장 긴게 32bit int 범위를 넘어간다는것을 예상하지 한번더 고생함.
 - 하지만 예제 입출력이 다양하게 잘 되어 있어서 이런 실수들을 다 커버해주심..
 - 결과 : 337.28

struct Point 
{ 
    int x1, y1, x2, y2; 
}; 

class ThreeTeleports 
{ 
public: 
    long long result; 
    int xMe, yMe, xHome, yHome; 
    Point tele[3]; 
    int used[3]; 
    bool backword[3]; 
    bool allUsed() 
    { 
        for(int i = 0; i < 3; i++) 
        { 
            if(used[i] == 0) return false; 
        } 
        return true; 
    } 

    int nextUsedNumber() 
    { 
        int maxvalue = 0; 
        for(int i = 0; i < 3; i++) 
        { 
            maxvalue = max(maxvalue, used[i]); 
        } 
        return maxvalue+1; 
    } 

    long long getDistance(long long x1, long long y1, long long x2, long long y2) 
    { 
        return abs(x1-x2)+abs(y1-y2); 
    } 

    void setMinimumPath() 
    { 
        int prevX = xMe; 
        int prevY = yMe; 
        long long nowPath = 0; 
        for(int i = 1; i <= 3; i++) 
        { 
            for(int j = 0; j < 3; j++) 
            { 
                if(used[j] == i) 
                { 
                    nowPath += 10; 
                    if(backword[j] == false) 
                    { 
                        nowPath += getDistance(prevX, prevY, tele[j].x1, tele[j].y1); 
                        prevX = tele[j].x2; 
                        prevY = tele[j].y2; 
                    } 
                    else 
                    { 
                        nowPath += getDistance(prevX, prevY, tele[j].x2, tele[j].y2); 
                        prevX = tele[j].x1; 
                        prevY = tele[j].y1; 
                    } 
                } 
            } 
        } 
        nowPath += getDistance(prevX, prevY, xHome, yHome); 

        result = min(result, nowPath); 
    } 

    void getMinimumPath() 
    { 
        if(allUsed())return; 
        for(int i = 0; i < 3; i++) 
        { 
            if(used[i] == 0) 
            { 
                used[i] = nextUsedNumber(); 
                backword[i] = false; 
                setMinimumPath(); 
                getMinimumPath(); 
                backword[i] = true; 
                setMinimumPath(); 
                getMinimumPath(); 
                used[i] = 0; 
            } 
        } 
    } 
    int shortestDistance(int xMe, int yMe, int xHome, int yHome, vector <string> teleports)
    { 
        this->xMe = xMe; 
        this->yMe = yMe; 
        this->xHome = xHome; 
        this->yHome = yHome; 
        for(int i = 0; i < teleports.size(); i++) 
        { 
            used[i] = 0; 
            sscanf(teleports[i].c_str(), "%d %d %d %d", &tele[i].x1 
                                                      , &tele[i].y1 
                                                      , &tele[i].x2 
                                                      , &tele[i].y2); 
        } 
         
        result = getDistance(xMe, yMe, xHome, yHome); 
        getMinimumPath(); 

        return (int)result; 
    } 
};
900 - BinaryCards
 - 대회를 30분이나 늦게 시작했더니 900문제를 열었을땐 시간이 8분밖에 남지 않아 깨끗이 포기.
 - 으아니 근데 이게 Div1 250 이라니!!
 - 같은 방 어떤 분이 풀었으나 챌린지 할때 공격을 못함.
 - 그분은 Sys fail 뜸.
 - 결국 아마 난 시간이 있었어도 쉽게 못 풀었을꺼야 아마.. ㅠㅠ








 
저작자 표시
Posted by Mastojun
TAG SRM, Topcoder
감상/도서2011/03/06 20:45


위대한 승부 (원제 : Searching for bobby fischer)를 보고 그 주인공이 썻다는 책이 있길래 찾아 보았다. 책 상태를 봐도 알 수 있듯이 그리 쉽게 읽힌 책은 아니다.

간략히 느낌점.
_ 발달 이론을 믿자. 난 성장할 수 있다.
_ 집중의 중요성. 고수는 일반인들의 위기 상황에 집중하는 걸 평소에도 할 수 있단다. 같은 시간을 들이더라도 얻을 수 있는게 다른것은 당연함.
_ 자신을 다스리는 법 깨닫기. 안좋은 상황에서도 자신의 기량을 발휘할 수 있어야 한다.
_ 삶과 배움에 대한 깊은 성찰의 중요함. 조지 웨이츠킨은 스스로 생각을 하고 자신을 바라봄으로써 여러가지 배우는 방법을 터득했다.
_ 나만의 소프트존을 만들 수 있는 방법은 무엇일까? 에 대한 고민
_ 나만의 배움의 기술은?

달 가르키는 손가락 보기
_ 대만 나쁜놈들

엉뚱한 생각하기
_ htc가 그래서 안좋군 (...)

왜 재미있게 읽지 못했을까?
_ 자기 이야기를 주욱 늘어 놓는 것을 보면서 거기서 배움의 기술을 유추할 생각을 하지 못함. 책 제목은 배움의 기술이면서 왜 자기자랑만 한담? 하고 생각했었음 -_-;;
_ 문체가 재미있는 문체는 아님.

채스와 태극권에서 세계 정상에 올랐고 현재는 모든 선수 생활을 접고 배움에 대해서 강의 중이시란다. 내가 지금 이렇게 헛되이 하루를 보내는 동안 지구 어딘가에선 멋진 일을 해내고 있는 사람이 있다.

오늘 하루도 벌써 시간이 다 가네. 저녁해야지.

저작자 표시
Posted by Mastojun