알고리즘 문제

[C/C++ 백준 2258번] 정육점 (Silver 1)

새파란 공대생 2020. 8. 11. 14:05

https://www.acmicpc.net/problem/2258

 

2258번: 정육점

첫째 줄에 두 정수 N(1≤N≤100,000), M(1≤M≤2,147,483,647)이 주어진다. N은 덩어리의 개수를 의미하고, M은 은혜가 필요한 고기의 양이다. 다음 N개의 줄에는 각 고기 덩어리의 무게와 가격을 나타내는

www.acmicpc.net

같은 가격의 덩어리가 여러개일 경우, 그리고 같은 가격 여러개를 샀을 때와 가격이 조금 더 높은 덩어리 하나를 살 때와 비교해주는것을 주의해서 풀자.

 

#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct Meet{
	int w;
	int p;
}Meet;
bool comp(Meet a, Meet b){
	if(a.p==b.p)
		return a.w>b.w;
	return a.p< b.p;
}
int main(void){
	int N, M, total=0, weight=0, money=0;
	Meet meet[100001];
	scanf("%d %d", &N, &M);
	for(int i=0; i<N; i++){
		scanf("%d %d",&meet[i].w, &meet[i].p);
		total += meet[i].w;
	}
	if(total<M)
		printf("-1");
	else{
		sort(meet, meet + N, comp);
		for(int i=0; i<N; i++){
			weight += meet[i].w;
			if(i==0)
				money = meet[i].p;
			else{
				if(meet[i].p!=meet[i-1].p){
					money = meet[i].p;
				}
				else{
					money += meet[i].p;
				}		
			}
			if(weight>=M){
				while(i<N-1 && meet[i].p==meet[i+1].p)
					i++;
				if(i==N-1)
					printf("%d",money);
				else
					printf("%d",min(meet[i+1].p, money));
				break;
			}
		}
	}
}