본문 바로가기

PS/boj

백준 20159 동작 그만. 밑장 빼기냐?

https://www.acmicpc.net/problem/20159

 

20159번: 동작 그만. 밑장 빼기냐?

카드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 단, N은 짝수이다. 둘째 줄에 카드의 윗장부터 밑장까지 카드의 값 X (1 ≤ X ≤ 10,000)이 정수로 주어진다.

www.acmicpc.net

누적합을 사용하는 문제였습니다.

문제에서 저도 헷갈린 조건이 있었는데 밑장이란 현재 윗장인 카드의 바로 밑에 있는 카드가 아닌

맨 밑의 카드를 뜻하는 것이었습니다.(-_-)

밑장을 분배하는 순간 이 후 예정되어있던 분배순서가 정훈이와 상대가 바뀌게 됩니다. 이를 누적합을 통해 

순서대로 분배를 탐색하면서 현재 밑장으로 바꿀때 합이 어떻게 되는지 계산하면됩니다.

 

정훈이 차례일경우 여태까지 정훈이가 받은 카드들의 합 (현재 분배제외) + 이후 상대가 받을 카드의 합

상대의 차례일경우 여태까지 정훈이가 받은 카드들의 합 + 이후 상대가 받을 카드의합 - 밑장

#include<stdio.h>
#include<vector>
#include<queue>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
int N;
int arr[100004];
int o[100004];
int e[100004];
int main(){
    int mx=0;
    scanf("%i",&N);
    for(int x=2;x<N+2;x++){
        scanf("%i",&arr[x]);
        if(x%2==0) {
            mx+=arr[x];
            e[x]+=e[x-2]+arr[x];
        }
        else o[x]+=o[x-2]+arr[x];
    }
    for(int x=2;x<N+2;x++){
        if(x%2==0) mx=max(e[x-2]+o[N+1]-o[x-1],mx);
        if(x%2==1) mx=max(e[x-1]+o[N-1]-o[x-2],mx);
    }
    printf("%i",mx);
}

 

'PS > boj' 카테고리의 다른 글

백준 20437 문자열 게임 2  (0) 2023.01.06
백준 11952 좀비  (0) 2023.01.05
백준 25200 곰곰이와 자판기  (0) 2023.01.05
백준 24229 모두싸인 출근길  (0) 2023.01.04
백준 20168 골목 대장 호석 - 기능성  (0) 2023.01.03