
AtCoder Beginner Contest 220 A부터 D까지 업솔빙
falconlee236
·2022. 4. 29. 20:10
AtCoder Beginner Contest 220 A부터 D까지 업솔빙
atcoder에서는 동적 계획법과 간단한 그래프 문제를 공부하고. 코드포스에서는 그리디와 구현 그리고 수학 마지막으로 이분탐색을 공부하는 방식으로 생각하자. 그런데 이번 대회의 DP는 진짜 80%는 접근 했는데 점화식에서 왼쪽 항은 맞았지만 오른쪽 항이 틀려서 아쉽게 답을 참고하고 풀었다.
문제 옆에 붙어있는 난이도는 Atcoder Problems 에서 추정한 것으로 작성했다는 것을 미리 알린다.
A - Find Multiple (*14)
접기/펼치기
문제 설명
만약 그런 숫자가 없다면
문제 해설
정답 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int a, b, c; cin >> a >> b >> c;
int x = b / c * c;
cout << (a <= x ? x : -1);
return 0;
}
B - Base K (*58)
접기/펼치기
문제 설명
문제 해설
맨 뒷자리 숫자부터 차근차근히
맨 뒷자리 숫자를 뽑아내는 방법은
정답 코드
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
ll k, a, b; cin >> k >> a >> b;
auto f = [](ll num, ll k){
ll sum = 0;
ll tmp = 1;
while(num > 0){
sum += (num % 10) * tmp;
num /= 10;
tmp *= k;
}
return sum;
};
cout << f(a, k) * f(b, k);
return 0;
}
C - Long Sequence (*119)
접기/펼치기
문제 설명
문제 해설
먼저 주어진
이 문제의 핵심은
그리고
정답 코드
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n; cin >> n;
int a[n];
for(auto& x : a) cin >> x;
ll x; cin >> x;
ll sum = accumulate(a, a + n, 0ll);
ll cnt = x / sum * n;
x %= sum;
ll tmp = 0;
for(int i = 0; i < n; i++){
tmp += a[i];
if(tmp > x){
cnt += i + 1;
break;
}
}
cout << cnt;
return 0;
}
D - FG operation (*664)
접기/펼치기
문제 설명
수열의 길이가
- 연산
: 맨 왼쪽에 있는 두 값을 삭제한다. (이들을 각각 라고 하자.) 그리고 왼쪽 끝에 을 더한다. - 연산
: 맨 왼쪽에 있는 두 값을 삭제한다. (이들을 각각 라고 하자.) 그리고 왼쪽 끝에 을 더한다.
각
우리가 이 연산을 할때 생기는
가지 가능한 방법 중에서 연산의 마지막에 가 몇번 나오는가?
답이 크기 때문에 답을으로 나눈 나머지 값으로 구하자.
문제 해설
그냥 딱 봐도 DP문제이다 22. 이제 DP문제라는 의심이
그러면 이 문제를 dp로 어떻게 풀까? 나는 dp를 다음과 같이 정의했다.
연산을 번 했을 때, 맨 왼쪽 원소가 인 경우의 수
이렇게 dp를 정의하면
그리고 그 다음에는 bottom-up 방식으로 진행하면 된다.
정답 코드
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int mod = 998244353;
ll dp[100010][10];
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n; cin >> n;
int a[n];
for(auto& x : a) cin >> x;
dp[0][a[0]]++;
for(int i = 0; i < n - 1; i++){
for(int j = 0; j < 10; j++){
int x = (a[i + 1] + j) % 10, y = (a[i + 1] * j) % 10;
dp[i + 1][x] = (dp[i + 1][x] + dp[i][j]) % mod;
dp[i + 1][y] = (dp[i + 1][y] + dp[i][j]) % mod;
}
}
for(int i = 0; i < 10; i++) cout << dp[n - 1][i] << "\n";
return 0;
}
'알고리즘 > atcoder' 카테고리의 다른 글
AtCoder Beginner Contest 222 A부터 D까지 업솔빙 (0) | 2022.05.17 |
---|---|
AtCoder Beginner Contest 221 A부터 D까지 업솔빙 (0) | 2022.05.08 |
AtCoder Beginner Contest 219 A부터 D까지 업솔빙 (0) | 2022.03.21 |
AtCoder Beginner Contest 218 A부터 E까지 업솔빙 (0) | 2022.03.15 |
AtCoder Beginner Contest 217 A부터 E까지 업솔빙 (0) | 2022.03.08 |