题意
n个人m个学科,然后n行每行输入s,r,表示这个人专攻方向为s,能力值为r。现在要选出一些人参加竞赛,
任意选几个学科,但是要求每个学科选的人数必须相等,求所有人能力和的最大值。
思路
用vector存一下每个学科有哪些能力,从大到小排序,求个前缀和。
ans[j]表示选j个人的时候的答案,遍历一下所有数据,维护一下即可。
最终ans中最大值就是答案。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+5;
int n, m, ans[MAXN];
vector<int> a[MAXN];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
int s, r; scanf("%d%d", &s, &r);
s--;
a[s].push_back(r);
}
for (int i = 0; i < m; i++)
sort(a[i].begin(), a[i].end(), [](int a, int b){ return a > b; });
for (int i = 0; i < m; i++)
for (int j = 1; j < a[i].size(); j++) a[i][j] += a[i][j-1];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < a[i].size(); j++)
{
if (a[i][j] < 0) break;
ans[j] += a[i][j];
}
}
printf("%d\n", *max_element(ans, ans+n));
return 0;
}
/*
6 3
2 6
3 6
2 5
3 5
1 9
3 1
*/