Problem Solving 61

[Topcoder] SRM424 DIV2

어제 저녁 9시에 있었던 매치다. 집에서 하면 애들때문에 제대로 못할 거 같아서 회사에 남아서 했다. 간만에 500점 문제가 비교적 쉬웠던거 같고, 900문제도 그리 어렵지 않은거 같아 풀었는데 900문제는 문제이해를 잘 못해서 system fail됐다. 500문제를 challenge time에 두명 걸어봤는데, 둘다 실패났다. 9부터 나누어지는 수를 계산하면 되는 문제인데, 정말 엉뚱하게 소스가 빙빙 둘려졌길래..분명히 틀릴 거야 하고 챌린지를 했건만.. 실패라나 ㅎㅎ; 역시 챌린지는 확실할 때만 해야 될 듯하고, 다른 사람 소스를 파악하는 연습을 많이 해야 겠다는 것을 느꼈다. rating은 1점의 변경도 없이 그대로 고정이다; 250pt. 주어진 스트링에서 A, Z가 들어간 부분만 뒤집고, 다른 c..

[Topcoder] SRM144 ~ 148 DIV2 500pt 연습

Topcoder DIV2 medium문제들을 한번 풀어보자. SRM144 550pt. : encrypt된 문자를 decrypt하는 문제. 문제는 어렵지 않았으나 예외처리 같은 부분에 시간이 좀 소요 class BinaryCode { public: vector decode(string m) { vector ret; int n = m.size(); vector d; REP(i, n) d.pb( m[i] - '0'); int inx = 0; while(inx < 2) { vector out; bool is_fail = false; for(int i=0; i 1 || p < 0 ) { is_fail = true; break; } else { out.pb(p); } } inx++; if( is_fail || ( ..

Problem Solving 2008.11.03

[Topcoder] SRM 423 DIV2

지난주 수요일(10/29) 오전에 있었던 매치다. 난이도가 쉬웠던 250은 다들 쉽게 푼거 같고.. medium문제가 이번엔 600점으로 조금 어려운 난이도로 나왔다. 600점 문제는 x좌표와 y좌표로 나누어서 생각해 볼 수 있는데, 최소점과 최대점을 모두 검사하게 되면 시간초과가 난다. 그래서, 전체 좌표의 평균에 -10과 +10 사이로 계산하면 되지 않을까 해서 풀어봤는데, Challenge에서 걸렸다. ㅎㅎ DIV Summary 보니 600문제는 맞춘 사람이 몇명 없었고, 1000점은 맞춘 사람이 하나도 없는 평균이 꽤나 낮은 매치였다. 나는 600문제에서 Challenge가 두개 성공해서 rating이 좀 올랐다. ㅎ; 나중에 풀이를 보니 600문제는 이해도 잘못하고 있었다. 체커의 순서에 상관없..

[Topcoder] SRM407 ~ 409 연습

내일 SRM도 있고.. 한동안 topcoder를 못해본 거 같아 연습삼아 몇개 풀어봤다. SRM407 DIV2 : 250점짜리 치고 좀 복잡한 문제.. 오랜만에 해서 오래걸리나 했는데.. 매치 결과에도 많이들 못푼 문제다. 나중에 다시 한번 풀어볼 것. class SpiralWalking { public: int totalPoints(vector m) { int idx[] = { 0, 1, 0, -1 }; int idy[] = { 1, 0, -1, 0 }; vector d; REP(i, m.size()) { vector sub; REP(j, m[0].size()) { sub.pb(m[i][j]-'0'); } d.pb(sub); } int i = 0, j = 0, index = 0; in..

Problem Solving 2008.10.28

[Topcoder] SRM404 ~ 405 연습

SRM404 DIV2 : 오랜만에 topcoder를 해서 그런가 20분이나 걸렸다.. 꾸준히 연습을 해야겠음. 그냥 string을 sorting해서 eis인지 확인해도 된다. class ReadingBooks { public: int countBooks(vector r) { int ret = 0; int n = r.size(); for(int i=2; i< n; i++) { string s = r[i-2].substr(0,1) + r[i-1].substr(0,1) + r[i].substr(0, 1); if( count(ALL(s), 'i') == 1 && count(ALL(s), 's') == 1 && count(ALL(s), 'e') == 1) { i += 2; ret++; } } return ret;..

Problem Solving 2008.10.20

[USACO] 1.4 Packing Rectangles

4개 사각형에서 나올 수 있는 16가지 경우에 대해 4개의 사각형의 순서 4!인 24개의 경우 즉, 16*24개의 경우에 대해 각각 6가지 유형일때 최소로 싸는 사각형을 구했다. 6번째 유형에서 겹치는 부분 처리가 안되서 몇번 틀림.. 개인적으로 next_permutation 함수를 처음 써봤는데 상당히 쓸만한듯.. vector ret; bool find_cycle(int cycle[], int order) { int i = 0; while(order > 0) { cycle[i] = order % 2; order /= 2; i++; } return true; } bool check_value(int a, int b, int &cur, int &x, int&y) { if( cur >= a*b..

Problem Solving 2008.10.15

[USACO] 1.3 Prime Cryptarithm(Winning Solutions)

주어진 n이 10이기 때문에 O(n^5)이어도 시한제약에 걸리지 않았다. n이 충분히 작다면 단순하게 푸는 것도 이기는 방법이 될 수 있다. bool check_ok(int x, vector &d) { while(x) { int a = x % 10; if( find(ALL(d), a) == d.end() ) return false; x /= 10; } return true; } int main() { ofstream fout ("crypt1.out"); ifstream fin ("crypt1.in"); int n; fin >> n; vector d; REP(i, n) { int a; fin >> a; d.pb(a); } int f1 = 0, f2 = 0, ret = 0; REP(i, d.size()) {..

Problem Solving 2008.10.14

[USACO] 1.3 Calf Flac(Winning Solutions)

시간 제약조건때문에 계속 실패가 났다. 처음 시도한 방법은 n까지 돌면서, 2000부터 역으로 돌면서 펠린드롬인 경우 크기를 리턴하게 하면서, 나머지 경우에 대해 2000부터 현재 구한 값까지 펠린드롬인지 계산했다. 이 방법으로 1~7번 입력까지는 만족했으나, 계속 8번 입력이 1.5초를 초과했다. 결국 수정한 알고리즘은 n까지 돌면서, n을 중심으로 한 최대 펠린드롬의 크기를 구하는 방법. 앞의 방법이 n* 2000에 대해 펠린드롬을 계산하는데 반해 뒤의 방법은 n에 대해 펠린드롬을 계산한다. 즉, O(n*2000*펠린드롬계산)과 O(n*2*펠린드롬계산)의 차이로 볼 수 있겠다.. int check_pal(char d[], int start, int end, int n) { int ret = 0; wh..

Problem Solving 2008.10.13
반응형