https://www.acmicpc.net/problem/17224
17224번: APC는 왜 서브태스크 대회가 되었을까?
2019년 올해도 어김없이 아주대학교 프로그래밍 경시대회(Ajou Programming Contest, APC)가 열렸다! 올해 새롭게 APC의 총감독을 맡게 된 준표는 대회 출제 과정 중 큰 고민에 빠졌다. APC에 참가하는 참가자들이 너무 다양해 대회 문제 난이도 설정이 너무 어렵기 때문이다. APC는 프로그래밍 대회에 익숙하지 않은 학생들과 전공생이 아닌 학생들도 대거 참가하기 때문에 모두가 풀거나 도전할 수 있는 난이도 커브를 갖춰야 한다. 또한
www.acmicpc.net
그리디 문제다. 역량보다 쉬운 sub2의 문제를 최대한 많이 풀고 풀 수 있는 문제의 수에서 sub2를 풀어낸 수를 빼서 역량보다 쉬운 sub1의 문제를 푼다.
#include <iostream>
#include <utility>
#include <set>
#include <vector>
using namespace std;
int N, L, K; //N은 문제 수(문제에 번호라고 생각), L은 역량, K는 풀 수 있는 문제의 수
int sub1, sub2; //sub1의 난이도, sub2의 난이도
int cnt = 0; //현재 푼 문제의 갯수
int score; //획득한 점수
vector<pair<int, int>> vp; //sub1과 sub2의 난이도를 벡터에 저장
pair<int, int> p; //점수를 pair로 저장
set<int> st; //풀어낸 문제의 번호
int main() {
cin >> N >> L >> K;
//N개 만큼 문제의 번호에 따라 난이도를 입력
for (int i = 1; i <= N; i++) {
cin >> sub1 >> sub2;
p.first = sub1; //pair의 첫번째 값은 sub1
p.second = sub2; //pair의 두번째 값은 sub2
vp.push_back(p); //벡터의 갱신
}
//sub2의 난이도를 비교하여 140점을 최대한 많이 더한다.
for (int i = 0; i < vp.size(); i++) {
if (cnt == K) { //현재까지 푼 문제의 수가 풀 수 있는 문제수와 같으면
break; //탈출
}
if (vp[i].second <= L) { //두번째 난이도가 역량보다 쉬우면
cnt++; //푼 문제의 수 증가
score = score + 140; //획득한 점수의 140점을 더한다.
st.insert(i); //점수를 더한 문제는 다시 더하지 않도록 번호를 기억한다.
}
}
//sub1의 난이도를 비교하여 100점을 더한다.
for (int i = 0; i < vp.size(); i++) {
if (cnt == K) { //현재까지 푼 문제의 수가 풀 수 있는 문제의 수와 같으면
break; //턀출
}
if (vp[i].first <= L) { //sub1의 난이도가 역량보다 쉬우면
if (st.find(i) != st.end()) { //이미 풀었던 문제이면
continue; //무시
}
cnt++; //푼 문제의 수 증가
score = score + 100; //획득한 점수의 100점을 더한다.
}
}
cout << score;
}
'백준' 카테고리의 다른 글
백준13412 - 서로소 쌍 (0) | 2019.09.03 |
---|---|
백준1197 - 최소 스패닝 트리 (0) | 2019.09.01 |
백준1747 - 소수&팰린드롬 (0) | 2019.08.31 |
백준5568 - 카드 놓기 (0) | 2019.08.30 |
백준1350 - 진짜 공간 (0) | 2019.08.30 |