题意:n个人,m种课程,每个人掌握一种课程,有个掌握分数,可能是负数,选择一部分人使得掌握分数之和最大,选择的每门课程的人数必须相等
需要注意当前种类当前选择人数如果贡献值是负的就不选了。还看到一些每次排序写法,一开始以为那种复杂度比较大过不了的,emmmm
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int si,ri;
bool operator<(const node &a){
return ri>a.ri;
}
}a[1000000];
typedef long long ll;
int vis[1000000];
ll pre[1000000],sum[1000000];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i].si>>a[i].ri;
}
sort(a,a+n);
for(int i=0;i<n;i++){
int k=vis[a[i].si]+=1;
pre[a[i].si]+=a[i].ri;
if(pre[a[i].si]>0)//当前种类当前选择人数如果贡献值是负的就不选了
sum[k]+=pre[a[i].si];
}
ll ans=0;
for(int i=0;i<200000;i++){
ans=max(ans,sum[i]);
}
cout<<ans<<endl;
}