C. Multi-Subject Competition—貪心
阿新 • • 發佈:2018-12-01
- http://codeforces.com/contest/1082/problem/C
- 題意:有N個人M門課,給出每個人學習的課的種類x,掌握的水平y,然後選擇一部分人使得分數最高,
- 選擇規則為,要麼不選人,選人的課人數就得相等。
- 思路:桶標記一下每一個課程的人數,然後建立一個類似桶 的 優先佇列,把每一門課的掌握程度 push進去
- 然後在建一個桶,含義是最終決定派人的課程,每門課派多少人去的總分數,按照m門課,這門課的人數兩重for迴圈
- 因為是優先佇列會從分大的開始選,如果這門課選則這些人分數大於0就累計一下分數,否則跳過。
- 最終求一下,每門課派多少人去的總分數的最大值(當然這裡面可能包含有的課不派人去),
-
#include <bits/stdc++.h> using namespace std; typedef long long ll; int num[100005]; priority_queue<int> q[100005]; int ss[111111]; int main() { int n,m,i,j,x,y,sum; scanf("%d%d",&n,&m); for(i=1; i<=n; i++) { scanf("%d %d",&x,&y); num[x]++; q[x].push(y); } int ans = 0; for(i=1; i<=m; i++) { sum = 0; for(j=0; j<num[i]; j++) { sum += q[i].top(); q[i].pop(); if(sum>0) { ss[j+1]+=sum; ans=max(ans,ss[j+1]); } } } printf("%d\n",ans); return 0; }