TopCoder SRM 397 Div2 (완료)
Problem Solving/TopCoder logs 2008. 4. 13. 05:57
새벽 1시에 있었던 상금매치.. 상금매치라서 그런지 엄청나게 많은 사람이 몰렸다.. 대략 20분 정도를 남기고 1500명이 다 찼던 것 같다.. 근데 1시에 예정되어있던 매치는 시스템에 문제가 생겨서.. 20분 지연되었더.. 무슨 listener가 동작을 안한다나 뭐래나.. 그동안 채팅방에서는 도대체 listening 하는사람이 누구냐는 황당한(?) 질문들도 올라오고.. 뭐 조금 특이한 매치였다..
이번 매치는 다른 상금매치와는 다르게 약간 쉬웠던것 같다.. 나는 아쉽게도 두문제밖에 못풀었지만..;; 250점 문제는 매우 쉬운문제임에도 불구하고 삽질하다가 순위 쭈욱 밀리고.. 그대신 500에서 남들보다 좀 빨리 풀어서 2등까지 올라갔다.. 코딩단계에서는 5등까지 밀려났지만.. 챌에서 다들 줄줄이 떨어지면서 2등을 유지했다.. 덕분에 다시 1군 복귀.. 이제부터 열심히 해야지!!
방 2등 전체 56등..
[250] BreakingTheCode
input으로 code와 message가 들어온다.. code의 첫번째 문자는 "01", 두번째 문자는 "02", ..., 26번째 문자는 "26"으로 encoding 된다.. message가 encoding 된 문자열이면 decoding하고, decoding된 문자열이면 encoding 해서 return
문제 파악을 잘못해서 말리고.. 코딩에서 말리고.. 안드로메다로 여러번 왔다갔다했던 문제.. ㅠ_ㅠ input으로 encoding할 문자열만 들어오는줄 알았는데 encoding 된 문자열도 들어오는 것이었다.. 왜 샘플이 안나오나 한참 고민하다 시간을 다 까먹었다.. 음.. 그래도 500점만 잘 풀면 승산이 있다는 생각에 느긋하게 풀었다.. 153점에 submit!!!
[500] SortingGame
input으로 숫자 배열과 k가 주어지고.. 이 배열을 sort하려고 한다. 배열에서 k개의 연속된 sub-array를 뒤집는 것이 유일한 연산 방법일때, sort하기 위해서 필요한 최소 연산 횟수를 구하기..
이 문제는 문제를 읽자마자 솔루션이 바로 떠올랐다.. 11198 - Dancing Digits 문제와 비슷하다.. 물론 Dancing Digits 문제가 훨씬 더 복잡하다.. ㅋ
BFS로 모든 경우를 다 탐색했다.. 다른 사람 코드를 보니 같은 방법임에도 불구하고 코드가 훨씬 더 간결했다.. 흠.. STL 사용이 익숙치 않아서 코드가 많이 길어졌다..
[1000] CollectingMarbles
구슬의 무게가 주어지고, 가방의 크기와 가방의 개수가 주어진다.. (모든 가방은 같다) 이때, 최대 몇개의 구슬을 가져갈 수 있는지 구하는문제.. 즉, 0/1 Knapsack에서 가방이 여러개라고 생각하면 된다.
이 문제는 전형적인 recursion + memorization 문제.. 흠.. 항상 이런 류의 문제를 놓친다.. 흠..
현재 가방에 지금까지 담지않은 모든 구슬을 한개씩 넣어보고 또는 넣지않고 다음가방으로 넘어가는 방법으로 진행한다.. 그 중 최대값을 return한다.. 중복된 상태를 계산하지않기 위해 memorization 기법을 활용한다..
이번 매치는 다른 상금매치와는 다르게 약간 쉬웠던것 같다.. 나는 아쉽게도 두문제밖에 못풀었지만..;; 250점 문제는 매우 쉬운문제임에도 불구하고 삽질하다가 순위 쭈욱 밀리고.. 그대신 500에서 남들보다 좀 빨리 풀어서 2등까지 올라갔다.. 코딩단계에서는 5등까지 밀려났지만.. 챌에서 다들 줄줄이 떨어지면서 2등을 유지했다.. 덕분에 다시 1군 복귀.. 이제부터 열심히 해야지!!
방 2등 전체 56등..
[250] BreakingTheCode
input으로 code와 message가 들어온다.. code의 첫번째 문자는 "01", 두번째 문자는 "02", ..., 26번째 문자는 "26"으로 encoding 된다.. message가 encoding 된 문자열이면 decoding하고, decoding된 문자열이면 encoding 해서 return
문제 파악을 잘못해서 말리고.. 코딩에서 말리고.. 안드로메다로 여러번 왔다갔다했던 문제.. ㅠ_ㅠ input으로 encoding할 문자열만 들어오는줄 알았는데 encoding 된 문자열도 들어오는 것이었다.. 왜 샘플이 안나오나 한참 고민하다 시간을 다 까먹었다.. 음.. 그래도 500점만 잘 풀면 승산이 있다는 생각에 느긋하게 풀었다.. 153점에 submit!!!
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <vector>
5 #include <string>
6 #include <cctype>
7 using namespace std;
8
9 class BreakingTheCode {
10 public:
11
12 string decodingEncoding(string code, string message)
13 {
14 int i, j, k;
15 char c[128], m[128];
16 char buf[128];
17 string res;
18 strcpy(c, code.c_str());
19 strcpy(m, message.c_str());
20 k = 0;
21 if (isdigit(m[0])) {
22 for (i = 0; i < strlen(m); i+=2) {
23 j = m[i] - '0';
24 j *= 10;
25 j += m[i+1] - '0';
26 buf[k++] = c[j-1];
27 }
28 buf[k] = 0;
29 res = buf;
30 }
31 else {
32 for (i = 0; i < strlen(m); i++) {
33 for (j = 0; j < strlen(c); j++) {
34 if (m[i] == c[j])
35 break;
36 }
37 buf[k++] = ((j+1) / 10) + '0';
38 buf[k++] = ((j+1) % 10) + '0';
39 }
40 buf[k] = 0;
41 res = buf;
42 }
43 return res;
44 }
45
46 };
2 #include <cstdio>
3 #include <algorithm>
4 #include <vector>
5 #include <string>
6 #include <cctype>
7 using namespace std;
8
9 class BreakingTheCode {
10 public:
11
12 string decodingEncoding(string code, string message)
13 {
14 int i, j, k;
15 char c[128], m[128];
16 char buf[128];
17 string res;
18 strcpy(c, code.c_str());
19 strcpy(m, message.c_str());
20 k = 0;
21 if (isdigit(m[0])) {
22 for (i = 0; i < strlen(m); i+=2) {
23 j = m[i] - '0';
24 j *= 10;
25 j += m[i+1] - '0';
26 buf[k++] = c[j-1];
27 }
28 buf[k] = 0;
29 res = buf;
30 }
31 else {
32 for (i = 0; i < strlen(m); i++) {
33 for (j = 0; j < strlen(c); j++) {
34 if (m[i] == c[j])
35 break;
36 }
37 buf[k++] = ((j+1) / 10) + '0';
38 buf[k++] = ((j+1) % 10) + '0';
39 }
40 buf[k] = 0;
41 res = buf;
42 }
43 return res;
44 }
45
46 };
[500] SortingGame
input으로 숫자 배열과 k가 주어지고.. 이 배열을 sort하려고 한다. 배열에서 k개의 연속된 sub-array를 뒤집는 것이 유일한 연산 방법일때, sort하기 위해서 필요한 최소 연산 횟수를 구하기..
이 문제는 문제를 읽자마자 솔루션이 바로 떠올랐다.. 11198 - Dancing Digits 문제와 비슷하다.. 물론 Dancing Digits 문제가 훨씬 더 복잡하다.. ㅋ
BFS로 모든 경우를 다 탐색했다.. 다른 사람 코드를 보니 같은 방법임에도 불구하고 코드가 훨씬 더 간결했다.. 흠.. STL 사용이 익숙치 않아서 코드가 많이 길어졌다..
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <vector>
5 #include <string>
6 #include <queue>
7 #include <map>
8 using namespace std;
9
10 int n;
11
12 int make_int(int* board)
13 {
14 int i;
15 int r = 0;
16 for (i = 0; i < n; i++) {
17 r *= 10;
18 r += board[i];
19 }
20 return r;
21 }
22
23 class SortingGame {
24 public:
25
26 int fewestMoves(vector <int> board, int k)
27 {
28 int a;
29 int i, j, l, x, right, left, temp;
30 int b[50], c[50];
31 map<int, int> check;
32 queue<int> q;
33 n = board.size();
34 for (i = 0; i < n; i++) {
35 b[i] = board[i];
36 }
37 a = make_int(b);
38 q.push(a);
39 check[a] = 0;
40
41 while (!q.empty()) {
42 a = q.front();
43 temp = a;
44 q.pop();
45 for (i = n-1; i >= 0; i--) {
46 b[i] = temp % 10;
47 temp /= 10;
48 }
49 for (i = 1; i < n; i++) {
50 if (b[i] < b[i-1])
51 break;
52 }
53 if (i == n) {
54 printf("return %d..\n", check[a]);
55 return check[a];
56 }
57 for (i = 0; i+k-1 < n; i++) {
58 for (j = 0; j < n; j++) {
59 c[j] = b[j];
60 }
61 left = i;
62 right = i+k-1;
63 for (j = left, l = right; j <= right; j++, l--) {
64 c[j] = b[l];
65 }
66 x = make_int(c);
67 if (check.find(x) == check.end()) {
68 check[x] = check[a] + 1;
69 q.push(x);
70 }
71 }
72 }
73 printf("return -1..\n");
74 return -1;
75 }
76
77 };
2 #include <cstdio>
3 #include <algorithm>
4 #include <vector>
5 #include <string>
6 #include <queue>
7 #include <map>
8 using namespace std;
9
10 int n;
11
12 int make_int(int* board)
13 {
14 int i;
15 int r = 0;
16 for (i = 0; i < n; i++) {
17 r *= 10;
18 r += board[i];
19 }
20 return r;
21 }
22
23 class SortingGame {
24 public:
25
26 int fewestMoves(vector <int> board, int k)
27 {
28 int a;
29 int i, j, l, x, right, left, temp;
30 int b[50], c[50];
31 map<int, int> check;
32 queue<int> q;
33 n = board.size();
34 for (i = 0; i < n; i++) {
35 b[i] = board[i];
36 }
37 a = make_int(b);
38 q.push(a);
39 check[a] = 0;
40
41 while (!q.empty()) {
42 a = q.front();
43 temp = a;
44 q.pop();
45 for (i = n-1; i >= 0; i--) {
46 b[i] = temp % 10;
47 temp /= 10;
48 }
49 for (i = 1; i < n; i++) {
50 if (b[i] < b[i-1])
51 break;
52 }
53 if (i == n) {
54 printf("return %d..\n", check[a]);
55 return check[a];
56 }
57 for (i = 0; i+k-1 < n; i++) {
58 for (j = 0; j < n; j++) {
59 c[j] = b[j];
60 }
61 left = i;
62 right = i+k-1;
63 for (j = left, l = right; j <= right; j++, l--) {
64 c[j] = b[l];
65 }
66 x = make_int(c);
67 if (check.find(x) == check.end()) {
68 check[x] = check[a] + 1;
69 q.push(x);
70 }
71 }
72 }
73 printf("return -1..\n");
74 return -1;
75 }
76
77 };
[1000] CollectingMarbles
구슬의 무게가 주어지고, 가방의 크기와 가방의 개수가 주어진다.. (모든 가방은 같다) 이때, 최대 몇개의 구슬을 가져갈 수 있는지 구하는문제.. 즉, 0/1 Knapsack에서 가방이 여러개라고 생각하면 된다.
이 문제는 전형적인 recursion + memorization 문제.. 흠.. 항상 이런 류의 문제를 놓친다.. 흠..
현재 가방에 지금까지 담지않은 모든 구슬을 한개씩 넣어보고 또는 넣지않고 다음가방으로 넘어가는 방법으로 진행한다.. 그 중 최대값을 return한다.. 중복된 상태를 계산하지않기 위해 memorization 기법을 활용한다..
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <vector>
5 #include <string>
6 using namespace std;
7 #define max(x, y) ((x) > (y) ? (x) : (y))
8
9 int memo[1<<13][21][11];
10 int w[20];
11 int c, n;
12
13 int recur(int mask, int u, int v)
14 {
15 int i, max1;
16 if (memo[mask][u][v] != -1)
17 return memo[mask][u][v];
18 if (v == 0)
19 return 0;
20 max1 = 0;
21 for (i = 0; i < n; i++) {
22 if (mask & (1 << i))
23 continue;
24 if (w[i] > u)
25 continue;
26 max1 = max(max1, recur(mask | (1 << i), u - w[i], v) + 1);
27 }
28 max1 = max(max1, recur(mask, c, v-1));
29 return memo[mask][u][v] = max1;
30 }
31
32 class CollectingMarbles {
33 public:
34
35 int mostMarbles(vector <int> marblesWeights, int bagCapacity, int numberOfBags)
36 {
37 int i;
38 n = marblesWeights.size();
39 for (i = 0; i < n; i++) {
40 w[i] = marblesWeights[i];
41 }
42 c = bagCapacity;
43 memset(memo, -1, sizeof(memo));
44 return recur(0, c, numberOfBags);
45 }
46
47 };
2 #include <cstdio>
3 #include <algorithm>
4 #include <vector>
5 #include <string>
6 using namespace std;
7 #define max(x, y) ((x) > (y) ? (x) : (y))
8
9 int memo[1<<13][21][11];
10 int w[20];
11 int c, n;
12
13 int recur(int mask, int u, int v)
14 {
15 int i, max1;
16 if (memo[mask][u][v] != -1)
17 return memo[mask][u][v];
18 if (v == 0)
19 return 0;
20 max1 = 0;
21 for (i = 0; i < n; i++) {
22 if (mask & (1 << i))
23 continue;
24 if (w[i] > u)
25 continue;
26 max1 = max(max1, recur(mask | (1 << i), u - w[i], v) + 1);
27 }
28 max1 = max(max1, recur(mask, c, v-1));
29 return memo[mask][u][v] = max1;
30 }
31
32 class CollectingMarbles {
33 public:
34
35 int mostMarbles(vector <int> marblesWeights, int bagCapacity, int numberOfBags)
36 {
37 int i;
38 n = marblesWeights.size();
39 for (i = 0; i < n; i++) {
40 w[i] = marblesWeights[i];
41 }
42 c = bagCapacity;
43 memset(memo, -1, sizeof(memo));
44 return recur(0, c, numberOfBags);
45 }
46
47 };
'Problem Solving > TopCoder logs' 카테고리의 다른 글
TopCoder SRM 401 Div1 (2) | 2008.05.07 |
---|---|
TopCoder SRM 400 Div 1 (0) | 2008.05.02 |
리눅스에서 탑코더하기.. (0) | 2008.05.01 |
TopCoder SRM 399 Div 1 (0) | 2008.04.25 |
TopCoder SRM 398 Div1 (0) | 2008.04.16 |
SRM 395 Div1 (0) | 2008.04.09 |
TopCoder SRM 394 Div 1 (2) | 2008.03.24 |
흠냥.. 탑코더 SRM 393 참여 실패.. -_-;; (0) | 2008.03.12 |
TopCoder SRM 392 Div2 (0) | 2008.03.07 |
TopCoder SRM 391 Div1 (0) | 2008.02.27 |