1. 程式人生 > >C. Multi-Subject Competition—貪心

C. Multi-Subject Competition—貪心

 

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