본문 바로가기

반응형

프로그래밍 대회 풀이/Codeforces

[Codeforces] Round #709 (div. 2) A ~ D 풀이 2021.03.21 22:20 ~ 00:35 본 라운드 참여 (performance = 1844) 테크노컵은 뭔가 항상 어려운 느낌이다... 생각보다 퍼포먼스가 나쁘지 않게는 나왔는데, 개인적으로 요즘 코포 폼이 조금 올라왔다고 생각해서 더 아쉬운 기분이 든다. A. Prison Break (*800) 모든 칸들에서 밖으로 나갈 수 있기 위해서 제거해야 하는 벽의 수의 최소를 구하는 문제이다. 답은 가로 * 세로, 즉 칸의 개수이고 대회중에는 직관적으로 빠르게 해결했다. 정확한지는 모르겠으나 증명을 하자면, 각 칸마다 해당 칸에서 시작해서 밖으로 나갈 수 있는지 없는지를 상태로 표현하고, 벽이 제거된 이웃한 칸은 하나의 칸으로 합쳐진다고 생각하자. 벽을 하나 제거했을 때 밖으로 나갈 수 없었던 2개 이상..
[Codeforces] Round #706 (Div. 2) A ~ D 풀이 2021. 03. 10 21:05 ~ 23:05 참가 / performance = 1849 애드혹 범벅이었던 라운드.... D가 안터졌으면 2100 performance까지 나올 수 있었는데 아쉽다. (D 시스페일이 엄청 많았다) 다행히 C까지 빠르게 풀어서 레이팅이 하락하지는 않았다. A. Split it! 문자열을 2k + 1 개로 쪼갤 때, 앞의 k개와 뒤의 k개는 각각 서로 reverse된 형태로 나타낼 수 있는지에 대한 문제이다. 양끝에서부터 s[i]와 s[n-1-i]가 같은 최대 길이를 구하고, 이 길이가 k 이상이면 조건을 만족할 수 있다. k보다 크다면 남는 부분은 $a_{k+1}$에 모두 포함시켜주면 된다. 주의해야할 점은, 2k + 1이 n보다 큰 경우에는 애초에 2k+1개로 쪼갤 수 ..
[Codeforces] Round #705 (Div. 2) A ~ D 풀이 21.03.06 23:05 Round #705 참가 (Rating 1740 -> 1855 / Performance = 2137) 대회 시간도 2시간 15분이고, 세터의 예전 라운드도 어려운 난이도였고, 점수 분포를 보고도 대충 어려울 거라고 예상은 했지만, C부터 이렇게 어려울 줄이야.... 대회 때 C, D 솔브수가 1000명이 안되었다. 2시간이 아니어서 다행히 D까지 풀 수 있었다. A. Anti-knapsack (*800) n과 k가 주어질 때, {1, 2, ..., n}의 부분집합 중에서, 합이 k가 되도록 원소 일부를 고를 수 없는 최대 부분집합을 구하는 문제이다. 일단, k+1 ~ n까지는 항상 포함시켜도 된다. 그리고, (k-1, 1) , (k-2, 2) ... 등의 쌍이 둘을 더하면 k가..
[Codeforces] Round #559 (Div. 2) A ~ E 풀이 21.03.05 23:35 virtual 참가 / performance = 2391 A. A pile of stones (*800) +가 주어질 때는 돌이 1개 증가하고, -가 주어질 때는 돌이 1개 감소한다. 처음에 보유할 수 있는 돌은 임의로 정할 수 있고, 중간에 돌이 0개일 때 -가 들어오면 안 될 때, 최종적으로 가능한 최소 돌의 개수를 구하는 문제이다. 처음의 돌 수를 직접 정할 수 있으므로, 단순하게 -가 들어오는 경우, 만약 현재 돌이 0개이면 그대로 유지시켜주면 된다. 이 과정이 결국 처음의 돌 수를 1개 증가시키는 과정과 동일하다. [소스 코드] #include using namespace std; int main(void) { ios::sync_with_stdio(false); cin..
[Codeforces] Educational Round 102 A ~ E 풀이 2달 만에 본계로 참가했다. 부계로 계속 못 올라가는 게 현타 와서 마음을 다 비우고 본계로 했는데 약간 올랐다... 한동안 1800 퍼포 이상을 찍어본적이 없었는데 아이디에 적응하는 건가....? CF 1473A. Replacing Elements 배열의 어떤 원소를 다른 두 원소의 합으로 바꿀 수 있다. 이때, 배열의 모든 원소를 d 이하로 만들 수 있는지에 대한 문제이다. 기본적으로 주어지는 모든 원소가 d 이하이면 아무런 작업을 하지 않아도 된다. 만약 d보다 큰 원소가 하나 이상 존재한다면, 해당 원소를 바꿔주는 최적의 경우는 배열의 모든 원소 중 제일 작은 값 2개를 골라 바꿔주는 경우이므로, 배열을 오름차순으로 정렬하여 A[1] + A[2]가 d이하이면 YES이다. [소스코드] #includ..
[Codeforces] Round #552 (Div. 3) A ~ E 풀이 21.01.11 12:30 virtual 참가 (1시간 20분) / performance = 1816 A. Restoring Three Numbers (*800) 입력으로 a+b, a+c, b+c, a+b+c가 랜덤 순서로 들어온다. 이를 다 더하면 3(a+b+c) 이므로, a+b+c의 값을 구해줄 수 있다. 따라서 구한 a+b+c의 값과 동일한 입력을 찾은 뒤, 해당 입력에서 나머지 세 입력을 빼주면 각각 a,b,c가 나온다. [소스 코드] #include using namespace std; using ll = long long; int main(void) { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); ll a, b, c, d..
[Codeforces] Round #694 (Div. 2) 풀이 2021. 01. 05 23:35 본 라운드 참가 실력이 정체되어있다. 예전엔 더 올라갈 수 있는데 운이 안 따라주는 느낌이었다면 지금은 느낌이 좀 다르다.... 재활이 꽤 오래 걸릴 것 같다. 1471A. Strange Partition 주어진 배열에서 인접한 두 원소를 대신해서 두 원소의 합으로 대체할 수 있다. 배열의 원소는 1개만큼 줄어든다. 이 연산을 원하는 만큼 한 후에, 배열의 각 원소를 x으로 나눈 값을 올림 하여 모두 더한 합의 최솟값과 최댓값을 구해야 한다. 최대인 경우는 연산을 한번도 하지 않은 원래의 배열에서 합을 구해주는 경우이고, 최소인 경우는 연산을 n-1번 적용한, 즉 배열의 원소가 1개만 남았을 때이다. [소스 코드] #include using namespace std; u..
[Codeforces] Round #551 (Div. 2) A ~ D 풀이 2021.01.03. 15:00 virtual 참가 / performance = 1563 [풀이] 1153A. Serval and Bus (*1000) 버스별로 정류장에 처음 도착하는 시간과 배차간격이 주어질 때, 버스정류장에 t초에 도착했을 때 제일 먼저 탈 수 있는 버스를 구하는 문제이다. 처음에 A번치고 생각보다 까다로웠으나, n이 100이고 t가 10만이기 때문에 각 버스별로 정류장에 도착하는 시간을 모두 구해줘도 무방하다. 나는 priority_queue를 이용하여 현재 pq에 담겨있는 버스들의 도착 시간 중에 제일 빠른 것을 확인해서, t보다 작다면 배차간격만큼 더해줘서 다시 넣어주고, 처음으로 t보다 큰 값이 나온 경우에 출력을 해주었다. #include using namespace std;..