문제 : https://www.acmicpc.net/problem/3985


[ 알고리즘풀이 ]

1. 사람마다 원하는 너트롤의 조각을 입력받으면서, 가장 많이 받을 것 같은 사람을 갱신하고 너트롤에 check를 합니다.

2. 너트롤에 check 된 값들을 순회하며 실제로 가장 많이 받은 사람을 뽑습니다.

#include<iostream>

using namespace std;

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int L, N, a, b, l[1001] = {}, n[1001] = {};
	cin >> L >> N;

	int m = -1, index = 0;
	for (int i = 1; i <= N; i++) {
		cin >> a >> b;
		// 기대가 가장 큰 사람 뽑기.
		if ((b - a + 1) > m) {
			m = (b - a + 1);
			index = i;
		}
		for (int j = a; j <= b; j++)
			if(l[j] == 0)
				l[j] = i;
	}

	// 실제로 가장 많이 받는 사람 뽑기.
	m = -1;
	int ans = 0;
	for (int i = 1; i <= L; i++)
		n[l[i]]++;
	for (int i = 1; i <= N; i++)
		if (n[i] > m) {
			m = n[i];
			ans = i;
		}
	cout << index << '\n' << ans;
	return 0;
}

 

+ Recent posts