맛있는 사과 (BOJ 32963)
2025. 1. 28. 00:31ㆍBOJ
문제
문제 설명
- i번의 사과의 맛: ti
- i번의 사과의 크기: si
q개의 질문이 정수 p의 형태로 들어온다.
1. 사과의 맛(ti) 이 p값 이상인 사과를 선택해 준다.
2. 여기에서 가장 큰 사과의 개수를 출력해 준다.
문제 해설
- 우선 사과의 맛(t)을 기준으로 내림 차순으로 정렬해 준다.
vector<pair<int, int>> apples;
for (int i = 0; i < n; i++) apples.push_back({t[i], s[i]});
sort(apples.begin(), apples.end(), greater<>());
- 그런 다음 질문 정수들도 {입력받은 정수, 입력받은 순서(인덱스)} 의 형태로 지정해 주고 입력받은 정수를 기준으로 내림 차순으로 정렬해 준다.
vector<int> ans(q);
vector<pair<int, int>> queries;
for (int i = 0; i < q; i++) {
long long x; cin >> x;
queries.push_back({x, i}); //입력 받은 정수, 입력받은 순서(인덱스)
}
sort(queries.begin(), queries.end(), greater<>());
입력받은 정수를 기준으로 정렬하는 이유는 다음과 같이 확인할 수 있다.
예제
5 5 1 3 2 4 5 3 2 3 2 1 1 2 3 4 5
예제를 통해 확인한다면 apples에는 다음과 같이 저장이 될 것이다.{5,1}, {4,2}, {3,2], {2,3}, {1,3} //apples
apples를 이렇게 저장을 해두었기 때문에 오프라인 쿼리를 통해서 탐색하기 위해서는 큰 선택한 정수가 큰 수를 기준으로 하여서 마치 그리디와 비슷하게 점령해 나가야 한다!{5,5}, {4,4}, {3,3}, {2,2}, {1,1} //queries
이렇게 하게 된다면 apples와 queries에서도 볼 수 있듯이 차례대로 사과의 최대 크기를 구하고 개수를 산출해 낼 수 있다.{5,5} queries =>{5,1} apples 말고는 사과의 맛이 좋은 사과는 존재 안함! 최대 크기 : 1, 개수 : 1 {3,3} queries =>{5,1}, {4,2}, {3,2} 존재 최대 크기 : 2, 개수 : 2
최종 코드
#include<bits/stdc++.h>
using namespace std;
int n, q;
vector<long long> t, s;
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
long long x; cin >> x;
t.push_back(x);
}
for (int i = 1; i <= n; i++) {
long long x; cin >> x;
s.push_back(x);
}
vector<pair<int, int>> apples;
for (int i = 0; i < n; i++) apples.push_back({t[i], s[i]});
sort(apples.begin(), apples.end(), greater<>());
vector<int> ans(q);
vector<pair<int, int>> queries;
for (int i = 0; i < q; i++) {
long long x; cin >> x;
queries.push_back({x, i});
}
sort(queries.begin(), queries.end(), greater<>());
long long j = 0, mx = 0, cnt = 0;
for (int i = 0; i < q; i++) {
int limit = queries[i].first, idx = queries[i].second;
while (j < n && apples[j].first >= limit) {
if(j==0) mx=apples[j].second, cnt=1;
else{
if(mx<apples[j].second) mx=apples[j].second, cnt=1;
else if(mx==apples[j].second) cnt+=1;
}
j++;
}
ans[idx]=cnt;
}
for (int i = 0; i < q; i++) cout << ans[i] << "\n";
}
'BOJ' 카테고리의 다른 글
| 소수 수열 (BOJ 31827) (0) | 2025.03.09 |
|---|---|
| 색상환 (BOJ 2482) (0) | 2025.02.02 |
| XOR (BOJ 14245) (0) | 2025.01.14 |
| Ignition(점화) (BOJ 13141) (1) | 2024.08.08 |
| 세금 (BOJ 13907번) (3) | 2024.07.22 |

