이번 #408대회는 점수를 좀 더 올릴 수 있었는데 +13점 밖에 못올렸다.
1, 2번 문제를 풀었는데 1번 문제, 2번 문제를 빨리 풀었다.
하지만 2번 문제에 실수가 있다는 걸 나중에 깨닫고 다시 푼 결과
1시간 10분정도 후에 최종적으로 내게되어 많은 패널티를 받게 되고 결국 2번 문제의 점수를 많이 받지 못하였다.
이번 대회에서는 그래도 만족스럽게 느껴지는 것이, 예전보다 해석에 대해 덜 부담스럽게 되었고, 문제를 4번까지 볼 수 있었다.
(물론 못풀었지만.)
A번 문제는 다음과 같았다.
A. Buying A House :: http://codeforces.com/contest/796/problem/A
매우 쉬운 문제이다.
남자가 여자 집 근처에 살기위해 집을 사려하는데 여자와 최대한 가까이 살고싶고, 그리고 자신이 가진 돈 이하의 집을 사야한다.
이때 어느 집을 사야하나?
5 1 20
0 27 32 21 19
40
7 3 50
62 0 0 0 99 33 22
30
10 5 100
1 0 1 0 0 0 0 0 1 1
20
1번 예제는 여자가 1번 집에살고 남자의 수중에는 20의 돈이 있다.
이때 27, 32, 21은 모두 비싸서 못사니 19를 사야한다. 따라서 40
2번 예제는 여자가 3번 집에살고 남자의 수중에는 50이 있다.
이때 33, 22를 살 수 있으니 33을 사면 된다. 따라서 30
3번 예제는 여자가 5번 집에살고 남자의 수중에는 100이있다.
아무 집이나 다 살 수 있으니 5번가 가장 가까운 집을 사면된다. 따라서 3번 집을 사게 되고 거리는 20이 된다.
시간 복잡도는 O(N)이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int main() { int n, m, k; int house[102]; scanf("%d %d %d", &n, &m, &k); for (int i = 1; i <= n; i++) scanf("%d", &house[i]); int MIN = 99999; for (int man = 1; man <= n; man++) { if (house[man] == 0) continue; if (k < house[man]) continue; MIN = min(MIN, abs(man - m)); } printf("%d", (MIN) * 10); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
B번 문제는 다음과 같다.
7 3 4
3 4 6
1 2
2 5
5 7
7 1
1
5 1 2
2
1 2
2 4
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include <iostream> #include <cstdio> using namespace std; int hole[1000002]; int cup[1000002]; int main() { int n, m, k; scanf("%d %d %d", &n, &m, &k); cup[1] = 1; for (int i = 1; i <= m; i++) { int val; scanf("%d", &val); hole[val] = 1; } if (hole[1] == 1) { printf("1"); return 0; } for (int i = 0; i < k; i++) { int first, second; scanf("%d %d", &first, &second); if (cup[first] == 1) { cup[first] = 0; cup[second] = 1; } else if (cup[second] == 1) { cup[second] = 0; cup[first] = 1; } if (cup[second] == 1 && hole[second] == 1) { printf("%d", second); return 0; } else if (cup[first] == 1 && hole[first] == 1) { printf("%d", first); return 0; } } for (int i = 0; i <= n; i++) if (cup[i] == 1) printf("%d", i); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
C번과 D번은 문제를 나름대로 접근했다 생각했지만, 결과적으로 정답 코드를 보고 나니 틀렸다는 것을 느꼈다.
C번은 트리로 만들어서 적절하게 DFS를 돌리면 해결 될 것 같았다고 생각했고,
정답을 푼 사람들은, RMQ, map STL, DP 등등으로 푸신 분들이 많았다.
D번 문제는 최소 스패팅 트리 응용 문제인 것 같아 경찰서를 분기점으로 prim 알고리즘을 돌리면 어떨까 생각했지만,
이것도 DP, 다익스트라 등등의 다양한 방법이 존재했다.
이번 문제가 C부터 확 어려워진 감이있기도하지만 다음 부터는 안정적인 문제에서 실수없이
점수를 많이 받으며 어려운 문제도 도전 해 봐야 겠다.
'Applied > Programming Contests' 카테고리의 다른 글
[Csacademy] Csacademy Round #25 (Div. 2 only) 이야기 (0) | 2017.04.19 |
---|---|
[Csacademy] Csacademy Round #24 이야기 (0) | 2017.04.12 |
[Codeforces] VK Cup 2017 - Wild Card Round 1 (Unofficial Public Mirror) 이야기 (0) | 2017.04.07 |
[Csacademy] Csacademy Round #23 (Div. 2 only) 이야기 (0) | 2017.04.06 |
[Codeforces] Codeforces Round #407 (Div. 2) 이야기 (0) | 2017.03.30 |