21758번: 꿀 따기
첫 번째 줄에 가능한 최대의 꿀의 양을 출력한다.
www.acmicpc.net
문제
아래와 같이 좌우로 개의 장소가 있다.
장소들 중 서로 다른 두 곳을 골라서 벌을 한 마리씩 둔다. 또, 다른 한 장소를 골라서 벌통을 둔다. 아래 그림에서 연한 회색의 장소는 벌이 있는 장소이고 진한 회색의 장소는 벌통이 있는 장소이다.
두 마리 벌은 벌통으로 똑바로 날아가면서 지나가는 모든 칸에서 꿀을 딴다. 각 장소에 적힌 숫자는 벌이 지나가면서 꿀을 딸 수 있는 양이다.
- 두 마리가 모두 지나간 장소에서는 두 마리 모두 표시된 양 만큼의 꿀을 딴다. (벌통이 있는 장소에서도 같다.)
- 벌이 시작한 장소에서는 어떤 벌도 꿀을 딸 수 없다.
위의 그림과 같이 배치된 경우 두 마리의 벌 모두 의 꿀을 따서, 전체 꿀의 양은 54가 된다.
위의 그림과 같이 배치된 경우 왼쪽 장소에서 출발한 벌은 의 꿀을 따고 오른쪽 장소에서 출발한 벌은 4+9+9=22의 꿀을 따므로, 전체 꿀의 양은 57이 된다.
위의 그림과 같은 경우는 전체 꿀의 양이 31이 된다.
장소들의 꿀 양을 입력으로 받아 벌들이 딸 수 있는 가능한 최대의 꿀의 양을 계산하는 프로그램을 작성하라.
입력
첫 번째 줄에 장소의 수 이 주어진다.
다음 줄에 왼쪽부터 각 장소에서 꿀을 딸 수 있는 양이 공백 하나씩을 사이에 두고 주어진다.
출력
첫 번째 줄에 가능한 최대의 꿀의 양을 출력한다.
제한
- 3 ≤ N ≤ 100,000
- 각 장소의 꿀의 양은 1 이상 10,000 이하의 정수이다.
서브태스크
번호 | 배점 | 제한 |
1 | 11 | N ≤ 20 |
2 | 13 | N ≤ 500 |
3 | 31 | N ≤ 5 000 |
4 | 45 | 추가적인 제한이 없음. |
코드
import sys
input = sys.stdin.readline
n = int(input())
honey = list(map(int, input().split()))
ans = 0
# 누적합
acc = [honey[0]]
for i in range(1,n):
acc.append(acc[i-1]+honey[i])
# 벌벌꿀
for i in range(1, n-1): # i는 벌
total = 2*acc[-1] - honey[0] - acc[i] - honey[i]
if total > ans:
ans = total
# 벌꿀벌
for i in range(1, n-1): # i는 꿀
total = (acc[i] - honey[0]) + (acc[-1] - acc[i-1] - honey[-1])
if total > ans:
ans = total
# 꿀벌벌
for i in range(1, n-1): # i는 벌
total = acc[i-1] + (acc[-2] - honey[i])
if total > ans:
ans = total
print(ans)
3가지 경우로 나누어서 풀이한다. 빠르게 계산하기 위해 미리 누적합을 구해놓았다.
- 벌-벌-꿀
- 벌-꿀-벌
- 꿀-벌-벌
'문제풀이 > 누적합' 카테고리의 다른 글
[Python/파이썬] 백준 20440번 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1 (0) | 2023.07.04 |
---|---|
[Python/파이썬] 백준 10986번 나머지 합 (0) | 2023.07.02 |
[Python/파이썬] 백준 1749번 점수따먹기 (0) | 2023.05.12 |
[Python/파이썬] 백준 2015번 수들의 합 4 (0) | 2023.05.10 |
[Python/파이썬] 백준 15724번 주지수 (0) | 2023.04.12 |
21758번: 꿀 따기
첫 번째 줄에 가능한 최대의 꿀의 양을 출력한다.
www.acmicpc.net
문제
아래와 같이 좌우로 개의 장소가 있다.
장소들 중 서로 다른 두 곳을 골라서 벌을 한 마리씩 둔다. 또, 다른 한 장소를 골라서 벌통을 둔다. 아래 그림에서 연한 회색의 장소는 벌이 있는 장소이고 진한 회색의 장소는 벌통이 있는 장소이다.
두 마리 벌은 벌통으로 똑바로 날아가면서 지나가는 모든 칸에서 꿀을 딴다. 각 장소에 적힌 숫자는 벌이 지나가면서 꿀을 딸 수 있는 양이다.
- 두 마리가 모두 지나간 장소에서는 두 마리 모두 표시된 양 만큼의 꿀을 딴다. (벌통이 있는 장소에서도 같다.)
- 벌이 시작한 장소에서는 어떤 벌도 꿀을 딸 수 없다.
위의 그림과 같이 배치된 경우 두 마리의 벌 모두 의 꿀을 따서, 전체 꿀의 양은 54가 된다.
위의 그림과 같이 배치된 경우 왼쪽 장소에서 출발한 벌은 의 꿀을 따고 오른쪽 장소에서 출발한 벌은 4+9+9=22의 꿀을 따므로, 전체 꿀의 양은 57이 된다.
위의 그림과 같은 경우는 전체 꿀의 양이 31이 된다.
장소들의 꿀 양을 입력으로 받아 벌들이 딸 수 있는 가능한 최대의 꿀의 양을 계산하는 프로그램을 작성하라.
입력
첫 번째 줄에 장소의 수 이 주어진다.
다음 줄에 왼쪽부터 각 장소에서 꿀을 딸 수 있는 양이 공백 하나씩을 사이에 두고 주어진다.
출력
첫 번째 줄에 가능한 최대의 꿀의 양을 출력한다.
제한
- 3 ≤ N ≤ 100,000
- 각 장소의 꿀의 양은 1 이상 10,000 이하의 정수이다.
서브태스크
번호 | 배점 | 제한 |
1 | 11 | N ≤ 20 |
2 | 13 | N ≤ 500 |
3 | 31 | N ≤ 5 000 |
4 | 45 | 추가적인 제한이 없음. |
코드
import sys input = sys.stdin.readline n = int(input()) honey = list(map(int, input().split())) ans = 0 # 누적합 acc = [honey[0]] for i in range(1,n): acc.append(acc[i-1]+honey[i]) # 벌벌꿀 for i in range(1, n-1): # i는 벌 total = 2*acc[-1] - honey[0] - acc[i] - honey[i] if total > ans: ans = total # 벌꿀벌 for i in range(1, n-1): # i는 꿀 total = (acc[i] - honey[0]) + (acc[-1] - acc[i-1] - honey[-1]) if total > ans: ans = total # 꿀벌벌 for i in range(1, n-1): # i는 벌 total = acc[i-1] + (acc[-2] - honey[i]) if total > ans: ans = total print(ans)
3가지 경우로 나누어서 풀이한다. 빠르게 계산하기 위해 미리 누적합을 구해놓았다.
- 벌-벌-꿀
- 벌-꿀-벌
- 꿀-벌-벌
'문제풀이 > 누적합' 카테고리의 다른 글
[Python/파이썬] 백준 20440번 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1 (0) | 2023.07.04 |
---|---|
[Python/파이썬] 백준 10986번 나머지 합 (0) | 2023.07.02 |
[Python/파이썬] 백준 1749번 점수따먹기 (0) | 2023.05.12 |
[Python/파이썬] 백준 2015번 수들의 합 4 (0) | 2023.05.10 |
[Python/파이썬] 백준 15724번 주지수 (0) | 2023.04.12 |