- 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; }