Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 백준 한국이 그리울 땐 서버에 접속하지
- 관리형 학원
- 성북구 학원
- 백준 14246번
- C++ 문자열
- 백준 패션왕 신해빈
- 상월곡동 학원
- 월곡중학교 학원추천
- 상월곡역 학원
- 서울사대부고 학원
- 백준 14246번 K보다 큰 구간
- DFS
- 월곡동 학원추천
- 월곡중 학원
- 월곡역 학원
- 백준 dfs
- C# 병합정렬
- 백준 10709
- 백준 9375번 패션왕 신해빈
- c++ 조합
- C++ 9996
- OS
- 백준 2309번 일곱 난쟁이
- 운영체제
- 백준 토마토
- 백준 1049번
- c++ split
- 백준 K보다 큰 구간
- 고정 소수점
- 백준 1049번 기타줄
Archives
- Today
- Total
키베이루's diary
[C++] 백준 14246번 K보다 큰 구간 본문
1) 문제설명
https://www.acmicpc.net/problem/14246
14246번: K보다 큰 구간
n개의 자연수로 이루어진 수열이 주어질 때, 특정 구간 [i,j](i≤j)의 합이 k보다 큰 모든 쌍 i,j의 개수를 출력하시오.
www.acmicpc.net
2) 아이디어
presum(누적합)을 이용하여 presum배열에 누적된 합을 저장하고 그것을 이용해서 구간의 합을 구한다.
구간의 합이 K보다 큰 경우에만 while문을 진입하여 k보다 큰 쌍의 개수를 +1 한다.
★ 실행이 O(n^2)이 되지 않게 구현해야한다.
3) 코드
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
long long presum[100001];
long long arr[100001];
int main() {
long long n,k;
cin >> n;
// 누적합(presum을 구하는 코드)
for (int i = 1; i <= n; i++) {
cin >> arr[i];
presum[i] = presum[i - 1] + arr[i];
}
cin >> k;
long long cnt = 0;
// 특정구간의 합이 K보다 큰 쌍의 갯수를 찾는 LOOP
for (int i = 1; i <= n; i++) {
int j = 0;
while (presum[i] - presum[j] > k) { // 구간의 합이 K보다 큰 경우에만 loop 진입
cnt++; // k보다 큰 모든 쌍의 갯수를 센다.
j++;
if (j == i) { // j와 i가 같으면 구간의 합은 0이므로 그때 loop 탈출
break;
}
}
}
cout << cnt << endl;
}
'알고리즘 > 기타' 카테고리의 다른 글
[C++] 최대 공약수, 최소 공배수 (0) | 2023.05.08 |
---|---|
[C++] 백준 10709번 기상캐스터 (0) | 2023.01.17 |
[C++] 백준 2309번 일곱 난쟁이 (0) | 2022.12.27 |
[C++] Combination(조합) (0) | 2022.12.26 |
[C#] Merge Sort (1) | 2022.12.23 |
Comments