https://www.acmicpc.net/problem/7795
7795번: 먹을 것인가 먹힐 것인가
심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을
www.acmicpc.net
먹을 것인가 먹힐 것인가 문제는 누적을 이용하여 해결할 수 있습니다.
크기가 1인 A 생명체가 먹을 수 있는 먹이는 크기가 8인 A 생명체가 모두 먹을 수 있습니다.
따라서 생명체 A, B의 배열을 모두 정렬한 다음, 크기가 작은 A 생명체부터 먹을 수 있는 먹이의 개수를 구하고.
다음 크기의 A 생명체는 이전 A 생명체가 먹을 수 없었던 생명체부터 먹을 수 있는 먹이의 개수를 구하면 됩니다.
아래는 전체 코드입니다.
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
while(t--){
int n, m; cin >> n >> m;
int a[20000], b[20000];
for(int i = 0; i < n; i++) cin >> a[i]; // A 생명체 입력 받음
for(int i = 0; i < m; i++) cin >> b[i]; // B 생명체 입력 받음
sort(a, a + n); sort(b, b + m);
// start는 이전 생명체가 먹지 못했던 B 생명체의 idx
// t = 전체 쌍의 개수
// accu는 이전 생명체가 먹을 수 있는 먹이의 개수
int start = 0, t = 0, accu = 0;
for(int i = 0; i < n; i++){
int cur = start;
while(cur < m && a[i] > b[cur]) cur++;
// cur >=m 이거나 a <= b[cur]인 경우 while문 빠져나옴
// cur - start는 먹이의 개수
accu = accu + (cur - start);
t += accu; start = cur;
}
cout << t << "\n";
}
}
'Algorithm' 카테고리의 다른 글
[백준 5648번] 역원소 정렬 (C++) (0) | 2022.04.12 |
---|---|
[백준 1431번] 시리얼 번호 (C++) (0) | 2022.04.12 |
[백준 11652번] 카드 (C++) (0) | 2022.04.12 |
[백준 1541번] 잃어버린 괄호 (C++) (0) | 2022.04.07 |
[백준 11660번] 구간 합 구하기 5 (C++) (0) | 2022.04.07 |