반응형

www.acmicpc.net/problem/2461

 

2461번: 대표 선수

입력의 첫 번째 줄에는 학급의 수를 나타내는 N과 각 학급의 학생의 수를 나타내는 M이 하나의 빈칸을 사이에 두고 주어진다. 단, 1<=N,M<=1,000이다. 두 번째 줄부터 N개의 줄에는 각 줄마다 한 학급

www.acmicpc.net

 

[ 한국정보올림피아드 2011년 시도본선 중등부 3번 대표선수]

★ 우선순위 큐를 이용해서 풀어야 합니다.

edukoi.tistory.com/68?category=841618

 

19. c++ stl 우선순위 큐

● 우선순위 큐(priorith_queue) 컨테이너는 우선순위 queue를 구혀한 템플릿 클래스입니다. priority_queue 컨테이너에 설정된 기본 컨테이너는 vector입니다. ● priority_queue는 내부적으로 STL의 힙 알고리

edukoi.tistory.com

[ 백준 2461번 대표선수 소스코드 ]

#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

typedef pair<int, int> ci;

int main()
{
	int n, m, i, j, a;
	int max = -1, min;
	int ans = 2100000000;
	
	ci k;

	vector <int> v[1001];
	int cnt[1001]= {0,};
	//첫번째 항목으로 오름차순 정렬    
	priority_queue<ci, vector<ci>, greater<ci> > q;  
	
	scanf("%d %d", &n, &m);

	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			scanf("%d", &a);
			v[i].push_back(a);
		}
		sort(v[i].begin(), v[i].end());
	}
	
	for(i=0;i<n;i++)
	{
		cnt[i]=1;
		q.push(make_pair(v[i][0], i));
		if(max<v[i][0])
			max = v[i][0];
	}
	
	
	while(!q.empty())
	{
		k = q.top();
		q.pop();
		min = k.first;

		if(ans > max-min)
			ans = max-min;
		
		if(	cnt[k.second] == m) break;
		
		q.push(make_pair(v[k.second][cnt[k.second]], k.second));
		if(max < v[k.second][cnt[k.second]])
		{
			max = v[k.second][cnt[k.second]];	
		} 
		cnt[k.second]++;		
	};
	
	printf("%d", ans);
}
반응형
Posted by 명문코딩컴퓨터
,