Baekjoon/Silver
C++ / 백준 / 2428 / 표절
GitHubSeob
2023. 12. 9. 02:35
문제 |
https://www.acmicpc.net/problem/2428
2428번: 표절
첫째 줄에 제출한 솔루션의 개수 N이 주어진다. 둘째 줄에는 각 솔루션 파일의 크기 size(F1), size(F2), ..., size(FN)이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ size(Fi) ≤ 100,000,000) 솔루션 파일의 크기는 정수이
www.acmicpc.net
문제풀이 |
두 파일이 있을 때 두 조건을 만족해야 한다.
1. 작은 파일 <= 큰 파일
2. 작은 파일 >= 큰 파일 * 0.9
따라서 이분 탐색인 lower_bound를 이용하여 문제를 푼다.
모든 입력을 받았으면 sort를 통해 오름차순으로 정렬한다.
0번째 파일부터 N-1번째 파일까지 탐색을 한다.
탐색하는 idx번째 파일을 큰 파일로 둔다.
그렇다면 정렬된 파일 중에서 두 조건을 만족하는 작은 파일의 시작 구간을 찾으면 된다.
lower_bound를 통해 기준 (idx번째) 파일의 0.9를 곱한 값 이상의 파일을 찾으면 된다.
코드 |
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N(0);
cin >> N;
vector<double>files(N, 0);
int file(0);
for (int idx = 0; idx < N; ++idx) {
cin >> file;
files[idx] = file;
}
sort(files.begin(), files.end());
ll answer(0);
for (int idx = 0; idx < N; ++idx) {
file = files[idx];
int start_idx = lower_bound(files.begin(), files.begin() + idx, file * 0.9) - files.begin();
answer += idx - start_idx;
}
cout << answer;
}