티스토리 뷰
문제 설명 :
n개의 노래의 length와 beauty가 각각 주어진다. 나는 여기서 최대 k개의 노래를 선택해서 pleasure가 최대가 되도록 해야 하는데, pleasure를 계산하는 공식은 (선택한 노래들의 length들의 합)*(선택한 노래들 중에서 beauty가 가장 작은 값)으로 계산된다.
풀이 :
우선 beauty를 오름차순으로 정렬한다. 정렬을 하는 이유는 값을 크기 순으로 배치하여 한쪽 방향으로 순회함으로써 하한(lower bound)을 고정할 수 있기 때문이다. 문제에서 pleasure를 계산할 때 어차피 beauty가 가장 작은 값이 무엇인지만 중요하므로, 가장 작은 값을 미리 정해놓음으로써 나머지 노래들은 무조건 그 보다 beauty가 크다는 보장이 되는 것이다. 그런 다음에는 나머지 노래들 중에서 length가 가장 큰 노래들을 찾아야한다. 여기서 필요한 컨테이너가 최소 힙이다. 마지막 인덱스부터(beauty가 큰 순)보면서 현재 노래의 length를 최소 힙에 push한다. 그리고 이 힙에 들어있는 원소들의 합을 저장하는 변수로 sum을 두고 힙에 push할 때마다 sum에도 length를 더해준다. 만약에 힙의 크기가 K보다 커진다면 힙의 top(=힙 안에 있는 원소들 중 가장 원소)를 빼내면 된다. N~1 인덱스마다 이 시행을 반복해주면서 공식에 따라 pleasure를 계산한다.
주의할 점 :
-
배운 점 :
으아.. 콘테 때는 풀이까지 거의 다 근접했는데 아쉽게 못 풀었다. 최소 힙까지도 생각했었는데 역순으로 볼 생각을 미처 못했다...ㅠㅠ
코드 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include<stdio.h> #include<math.h> #include<string.h> #include<iostream> #include<functional> #include<string> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stdlib.h> #include<stack> using namespace std; typedef pair<int,int> pii; typedef pair<int,int> Cord; typedef long long ll; /****************************Default Template******************************/ // #define SIZE // #define IMP // #define INF // const int MOD= struct S{ int l,b; S(){} S(int _l,int _b){ l=_l; b=_b; } const bool operator<(const S &o) const{ return b<o.b; } }; priority_queue<int> pq; priority_queue<int,vector<int>,greater<int>> mpq; map<int,int> mp; stack<int> st; set<int> set_i; /****************************Default Template******************************/ const int SIZE= 300009; S arr[SIZE]; int main(){ int n,k; scanf("%d %d",&n,&k); for(int i=1 ; i<=n; i++){ int a,b; scanf("%d %d",&a,&b); arr[i]=S(a,b); } sort(arr+1,arr+1+n); ll ans=0,sum=0; for(int i=n ; i>=1 ; i--){ mpq.push(arr[i].l); sum+=arr[i].l; if(mpq.size()>k){ sum-=mpq.top(); mpq.pop(); } ans=max(ans,sum*arr[i].b); } printf("%lld\n",ans); return 0; } | cs |
'Problem Solving > Priority Queue' 카테고리의 다른 글
[Codeforces]1095C-Powers of Two (0) | 2018.12.28 |
---|---|
[BOJ 1826] 연료 채우기 (0) | 2018.12.19 |