알고리즘 문제
[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;
}
}
}
}