개발/백준
[백준] 12018번. Yonsei TOTO (C++)
yun000
2024. 1. 6. 17:14
문제 설명
https://www.acmicpc.net/problem/12018
12018번: Yonsei TOTO
연세대학교 수강신청이 얼마 전부터 바뀌어, 마일리지 제도로 바뀌었다. 이 제도는 각각의 학생들에게 마일리지를 주어 듣고 싶은 과목에 마일리지를 과목당 1~36을 분배한다. 그리고 모두 분배
www.acmicpc.net
해결 방법
+ (단 마일리지가 같다면 성준이에게 우선순위가 주어진다고 하자.) 이 조건을 제대로 안읽어서 조금 더 걸렸다.. 주의하자
applicant=4, avaliable=2라고 하자
신청자 4명 (0,1,2,3번째 신청자) 을 각각 투자한 마일리지 순으로 정렬한다.여기서 2번째 신청자가 투자한 마일리지 이상의 마일리지를 투자해야 한다.
int neededMIndex = applicant - avaliable; 몇번째 신청자 이상의 마일리지를 투자해야 하는지
if (neededMIndex >= 0)
{ neededM[s] = MInfo[neededMIndex]; } n번째 신청자와 같은 마일리지를 투자한다.
else
{ neededM[s] = 1; } 만약 신청자가 수강인원보다 적으면 1만 투자해도 된다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
//과목 수, 마일리지
int subjectCount, mileage;
cin >> subjectCount >> mileage;
//각 과목을 수강하기 위해 필요한 최소 마일리지
vector<int> neededM(subjectCount, 0);
for (int s = 0; s < subjectCount; s++)
{
//신청자 수, 수강인원
int applicant, avaliable;
cin >> applicant >> avaliable;
//MInfo 각 신청자들이 투자한 마일리지
vector<int> MInfo(applicant);
for (int i = 0; i < applicant; i++)
{ cin >> MInfo[i]; }
sort(MInfo.begin(), MInfo.end());
int neededMIndex = applicant - avaliable;
if (neededMIndex >= 0)
{ neededM[s] = MInfo[neededMIndex]; }
else
{ neededM[s] = 1; }
}
sort(neededM.begin(), neededM.end());
//들을 수 있는 과목개수 확인
int count = 0;
for (int i = 0; i < subjectCount; i++)
{
mileage -= neededM[i];
if (mileage < 0) { break; }
count++;
}
cout << count;
}