on
2019-2020 ICPC Southeastern European Regional Programming Contest...
2019-2020 ICPC Southeastern European Regional Programming Contest...
반응형
문제
https://codeforces.com/gym/102392
https://www.acmicpc.net/category/detail/2110
풀이
https://oi.in.ua/wp-content/uploads/2019/10/seerc-2019-editorial.pdf
21.09.09 21:00~ 5시간, 232/1148, 전체 11문제 중 4솔DGIJ(업솔빙 1 F) 조금 아쉬웠었다.
손대던것들만 바로 다 풀리고 E고민을 조금 더 했으면 뭔가 유의미한 결과가 나왔을 것 같다.
B. Level Up
문제
2개의 레벨을 올리려 한다. 레벨 0->1은 s1, 1->2는 s2의 경험치가 필요하다.
퀘스트가 n개 있는데
0레벨에서 퀘스트를 한 경우 t시간이 걸리고 x경험치를 얻는다.
1레벨에서 퀘스트를 한 경우 r시간이 걸리고 y경험치를 얻는다.
레벨업을 성공적으로 할 수 있다면 레벨업에 걸리는 최소 시간을 출력하고,
안되면 -1을 출력한다.
단, 0레벨에서 s1이상으로 얻는 경험치는 잔여경험치만큼 1레벨에서 얻을 수 있다.
문제 풀이
dp[i][j][k]가 i번째까지의 퀘스트를 볼 때 0레벨은 j만큼 채워졌고 1레벨은 k만큼 채워졌다고 하자.
dp[i+1][j+x][k] = min(dp[i+1][j+x][k], dp[i][j][k]+t)
dp[i+1][j][k+y] = min(dp[i+1][j][k+y], dp[i][j][k]+r)
만약 j+x>=s1이 되면 dp[i+1][j][k+j+x-s1] = min(dp[i+1][j][k+j+x-s1], dp[i][j][k]+t)
소스코드
(맞왜틀 상태)
D. Cycle String?
문제
2n길이 문자열을 입력받아서 잘 배치하여 연속하는 n길이 substring들이 모두 다르게 만들어라.
문제풀이
같은 문자의 개수가 최대 n개면 정렬하여 배치할 경우 무조건 모두 다른 문자열이 된다.
같은 문자의 개수가 2n-3개보다 작으면 n-1개의 최대문자 배치 후 나머지 문자 1개를 배치하고 남은 최대문자를 배치 후 나머지 문자들을 배치하면 무조건 모두 다른 문자열이 된다.
같은 문자(a)의 개수가 2n-2개인 경우 나머지 2개 문자의 종류가 같다면 어떻게 배치를 해도 같은 substring이 나온다.
나머지 2개의 문자(b, c)가 다른 경우 n-1개의 a를 배치하고 b를 배치한 후 n-1개의 a를 배치하고 c를 배치하면 된다.
소스코드
#include using namespace std; char s[1000010]; int w=-1, mx=0, ch[30], n; int main() { scanf("%s", s); for (int i = 0; s[i]; n=++i) { ch[s[i] - 'a']++; if (mx < ch[s[i] - 'a']) { mx = ch[s[i] - 'a']; w = s[i] - 'a'; } } if (n == 2) { if (mx == 1) { puts("YES"); puts(s); } else puts("NO"); return 0; } if (mx > n - 2) { puts("NO"); return 0; } vector v; for (int i = 0; i < 26; ++i) { if (ch[i] && i!=w) v.push_back(i); } if (mx == n - 2) { if (v.size() == 1) { if (n == 4) { puts("YES"); for (; mx--;) printf("%c", w + 'a'); for (auto u : v) for (; ch[u]--;) printf("%c", u + 'a'); return 0; } puts("NO"); return 0; } else { puts("YES"); for (int i = 1; i < n>>1; ++i) printf("%c", w + 'a'); printf("%c", v[0] + 'a'); for (int i = 1; i < n>>1; ++i) printf("%c", w + 'a'); printf("%c", v[1] + 'a'); return 0; } } if (mx > n>>1) { puts("YES"); for (int i = 1; i < n >> 1; ++i, --mx) printf("%c", w + 'a'); printf("%c", v[0] + 'a'); --ch[v[0]]; for (; mx--;) printf("%c", w + 'a'); for (auto u : v) for (; ch[u]--;) printf("%c", u + 'a'); return 0; } puts("YES"); for (; mx--;) printf("%c", w + 'a'); for (auto u : v) for (; ch[u]--;) printf("%c", u + 'a'); return 0; }
F. Game on a Tree
문제
게임을 한다. 시작은 Alice부터.
트리에서 임의의 노드 하나를 선택하면 해당 노드가 검은색이 된다.
다음 사람은 선택된 노드의 조상 또는 자손 노드로 갈 수 있다.
자신의 차례에서 갈 수 있는 노드가 없어지면 지게 된다.
문제풀이
관찰
1. 트리에서 루트를 거치는 경우 최대 부트리 2개까지밖에 못간다.
2. 자식이 1개이고 자식이 루트인 서브트리가 이기는 트리라면 자신은 지는 트리다.
+ 에디토리얼을 참고
소스코드
#include using namespace std; vector v[100010]; bool vis[100010]; int dfs(int w) { vis[w] = 1; int D=0; for (auto u : v[w]) { if (vis[u]) continue; D+=dfs(u); } if (D > 0) return D-1; if (D == 0) return 1; } int main() { int n; scanf("%d", &n;); for (int i = 1, u, w; i < n; ++i) { scanf("%d%d", &u;, &w;); v[u].push_back(w); v[w].push_back(u); } puts(dfs(1) ? "Alice" : "Bob"); }
반응형
from http://azatos.tistory.com/50 by ccl(A) rewrite - 2021-09-12 19:26:50