반응형
www.acmicpc.net/problem/1912
연속합 성공분류
시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초 (추가 시간 없음) | 128 MB | 76265 | 23168 | 15994 | 29.621% |
문제
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.
예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.
입력
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
출력
첫째 줄에 답을 출력한다.
예제 입력 1 복사
10 10 -4 3 1 5 6 -35 12 21 -1
예제 출력 1 복사
33
예제 입력 2 복사
10 2 1 -4 3 4 -4 6 5 -5 1
예제 출력 2 복사
14
예제 입력 3 복사
5 -1 -2 -3 -4 -5
예제 출력 3 복사
-1
#include <iostream>
#include <algorithm>
using namespace std;
int arr[100005];
int d[100005];
int main(void)
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> arr[i];
d[1] = arr[1];
for (int i = 2; i <= n; i++)
{
d[i] = max(d[i -1], 0) + arr[i];
}
cout << *max_element(d + 1, d + n + 1);
}
// int main(void)
// {
// int n;
// cin >> n;
// int num; // input
// int inner_sum;
// int maxsum;
// cin >> num;
// if (n == 1)
// {
// cout << num;
// return (1);
// }
// inner_sum = num;
// maxsum = num;
// for (int i = 1; i < n; i++)
// {
// cin >> num;
// if (num >= 0) // update inner_sum
// {
// inner_sum += num;
// }
// else // num < 0 so update maxsum
// {
// if (inner_sum > maxsum)
// maxsum = inner_sum;
// inner_sum = 0;
// }
// }
// cout << maxsum;
// }
처음에는 연속합이라는게 마이너스 값 나오면 처음 부터 다시 합해줘야할 줄 알았는데 그게 아니라 그냥 뭉텅이로 더해서 크면 되는 거였음 그래서 max( , 0) 0이랑 비교하는 것!!
www.acmicpc.net/source/share/645f1b8f53034a41b486d65a98303bf2
위의 공유 소스 참고했다.
blog.encrypted.gg/737?category=773649
강의는 여기 참고
반응형
'C언어' 카테고리의 다른 글
vscode 한번에 단어 바꾸기 (0) | 2021.01.28 |
---|---|
코드업 3704 계단오르기2 (0) | 2021.01.26 |
1965 상자넣기 : 가장 길게 커지는 수 랑 같은 풀이임 (0) | 2021.01.25 |
백준 15665번 : N 과 M 11번 prinarr != arr[i] (0) | 2021.01.24 |
백준 11726 2*n 타일링 ( 시간 지나고 또 품) (0) | 2021.01.23 |
백준 1149 rgb 거리 (0) | 2021.01.22 |
codeup코드업 2608 동아리 회장 선거 (0) | 2021.01.20 |
코드업 codeup 4033 네모네모 로직 (0) | 2021.01.20 |