하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 21759 꿀따기 C++

긤효중 2022. 6. 13. 21:41

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

 

21758번: 꿀 따기

첫 번째 줄에 가능한 최대의 꿀의 양을 출력한다.

www.acmicpc.net

#include <iostream>
using namespace std;
int max(int a,int b){
    if(a>b){
        return a;
    }
    else{
        return b;
    }
}
int arr[100001];
int sum[100001];
int main(void){
    int n;
    cin >> n;
    for(int i = 0;i<n;i++){
        cin >> arr[i];
        sum[i] = sum[i-1] + arr[i];
 
    }
    //1) 벌과 벌 사이 꿀통 위치 벌---꿀통----벌
    int max_sum = 0;
    int left = 0;
    int right = n-1;
    /* 꿀통이 left - right 사이에 위치할 때 꿀의 양의 합 */
    
    for(int i = 1;i<n-1;i++){
        int sum_l = sum[n-1] - arr[left] - (sum[n-1] - sum[i]);
        int sum_r = sum[n-1] - sum[i] - arr[right] + arr[i];
        max_sum = max(max_sum,sum_l + sum_r);
    }
    
    /*꿀통이 벌 2마리의 위치보다 오른쪽에 위치 할 경우 벌---벌-----꿀통 
      벌 한마리를 왼쪽에 고정, 꿀통 제일 오른쪽에 고정 후 
      벌 한마리를 벌-꿀통 사이를 지나게 */
    
    for(int i = 1;i<n-1;i++){
        int sum_l = sum[n-1] - arr[0] - arr[i];
        int sum_r = sum[n-1] - sum[i];
        max_sum = max(max_sum,sum_l + sum_r);
    }
    
    /*꿀통이 벌 2마리보다 왼쪽에 위치 할 경우 꿀통 ----벌 ---벌
    꿀통 제일 왼쪽 고정, 벌 한마리를 제일 오른쪽에 고정 후
    벌 한마리를 벌 - 꿀통 사이 지나게 */
    
    for(int i = 1;i<n-1;i++){
        int sum_l = sum[i] - arr[i];
        int sum_r = sum[n-1] - arr[n-1] - arr[i];
        max_sum = max(max_sum,sum_l + sum_r);
    }
    cout << max_sum;
    
    
    
    
}