1. 程式人生 > >Codeforces 1082C Multi-Subject Competition(字首+思維)

Codeforces 1082C Multi-Subject Competition(字首+思維)

題目連結:Multi-Subject Competition

題意:給定n名選手,每名選手都有唯一選擇的科目si和對應的能力水平。並且給定科目數量為m。求選定若干個科目,並且每個科目參與選手數量相同的情況下的最大能力水平。

題解:每位選手扔到對應的科目裡面從1-m遍歷科目,能力值排序下,維護下能力值和,大於0就給到當前位置人數答案加上該值,否則跳出(給負價值是沒有意義的),最後遍歷一遍人數對應的價值,拿最大的即可。

 1 #include <vector>
 2 #include <cstdio>
 3 #include <iostream>
 4
#include <algorithm> 5 using namespace std; 6 7 const int N=1e5+10; 8 int ans[N]; 9 vector <int> v[N]; 10 11 int main(){ 12 int n,m,s,r,mx=0; 13 scanf("%d%d",&n,&m); 14 for(int i=1;i<=n;i++){ 15 scanf("%d%d",&s,&r); 16 v[s].push_back(r);
17 } 18 for(int i=1;i<=m;i++){ 19 int sum=0,sz=v[i].size(); 20 sort(v[i].begin(),v[i].end()); 21 mx=max(mx,sz); 22 for(int j=sz-1;j>=0;j--){ 23 sum+=v[i][j]; 24 if(sum>=0) ans[sz-j]+=sum; 25 else break; 26 }
27 } 28 int res=0; 29 for(int i=1;i<=mx;i++) res=max(res,ans[i]); 30 printf("%d\n",res); 31 return 0; 32 }
View Code