문제 : 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;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 11660 : 구간 합 구하기 5(코드개선) - travelbeeee (0) | 2020.02.17 |
---|---|
[BOJ] 11660 : 구간 합 구하기 5 - travelbeeee (0) | 2020.02.17 |
[BOJ] 17471 : 게리맨더링 - travelbeeee (0) | 2020.02.17 |
[BOJ] 2565 : 전깃줄 - travelbeeee (0) | 2020.02.16 |
[BOJ] 1059 : 수2 - travelbeeee (0) | 2020.02.14 |