개발/백준

[백준] 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;

}