문제 설명
앨리스와 밥은
처음에 앨리스와 밥은 격자
가능한 움직임은 다음과 같다.
- 오른쪽으로 이동
- 아래쪽으로 이동
첫번째로 앨리스가
두번째로 밥이
이 게임의 점수는 밥이 담은 코인의 개수로 정해진다.
앨리스는 점수를 최소화하고 싶고, 밥은 점수를 최대화 하고 싶다. 두 참가자가 최적의 방식으로 게임을 했을 때 점수는 몇점일까?
Input
첫번째 줄에는 테스트 케이스를 의미하는 정수
각 테스트 케이스의 첫번째 줄에는 격자판의 열의 길이인
각 테스트 케이스의 다음에는 격자판의 상태를 나타내는 정수가 두줄에 걸쳐서 주어진다.
Output
각 테스트케이스마다 두 참가자가 최적의 방법으로 게임을 진행했을때 얻을 수 있는 점수를 출력한다.
Example
input
3
3
1 3 7
3 5 1
3
1 3 9
3 5 1
1
4
7
output
7
8
0
문제 접근
사용한 알고리즘: 구성적 알고리즘, 구현, 누적합
걸린 시간 : 00:06
개인적으로 B번보다 쉽다고 느낀 문제. 경우의 수를 찾기 쉬웠다. 문제만 이해하면 풀 수 있을 것 같다.
모든 참여자는 무조건 오른쪽과 아래로만 이동할 수 있기 때문에 반드시
형태로 반드시 움직여야 한다는 뜻이다.
앨리스가 이동할 수 있는 경로는 결국 열의 개수인
즉 앨리스가 이동하는 각 경우에서 밥이 먹을 수 있는 코인의 최댓값을 구하고 그 값중에서 최소값을 구하면 두 사람이 최적의 플레이을 했을 때 얻을 수 있는 점수를 의미한다.
정답 코드
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--){
int n; cin >> n;
int arr[2][n];
for(int i = 0; i < 2; i++){
for(int j = 0; j < n; j++) cin >> arr[i][j];
}
int sum1 = 0, sum2 = 0, ans = 1e9;
for(auto x : arr[0]) sum1 += x;
for(int i = 0; i < n; i++){
sum1 -= arr[0][i];
ans = min(ans, max(sum1, sum2));
sum2 += arr[1][i];
}
cout << ans << "\n";
}
return 0;
}
'알고리즘 > codeforces' 카테고리의 다른 글
Codeforces Round #752 (Div. 2) A부터 D까지 업솔빙 (0) | 2022.01.02 |
---|---|
Codeforces Round #737 (Div. 2) A부터 C까지 업솔빙 (0) | 2021.12.30 |
Educational Codeforces Round 112-B. Two Tables (0) | 2021.12.25 |
Educational Codeforces Round 112-A. PizzaForces (0) | 2021.12.25 |
Codeforces Round #736 (Div. 2)-C. Web of Lies (0) | 2021.12.20 |