codeforces+C. Multi-Subject Competition+技巧

题目链接:http://codeforces.com/problemset/problem/1082/C
题目大意:

有n个人,m个竞赛,(1≤n≤10^5, 1≤m≤10^5)
每个人熟悉一个竞赛si,并且熟悉的本领为ri(ri可以为负)
现在让你选择去参加竞赛的人,对应选择的要求:对于有人去的这些竞赛,去的人数必须相同,有的竞赛可以没人去。

问你去的人的本领总和最大是多少?

思路:

但是复杂度为O(n*m)。
但是可以用边求前缀和边求C[i]数组,复杂度为O(n)

 for(int i=1;i<=m;i++)
    {
        sort(v[i].begin(), v[i].end(), ru);//排序
        long long s=0;
        for(int j=0;j<v[i].size();j++)
        {
            s+=v[i][j];
            if(s>0)/*如果前缀和>0那么选择j个人,一定会选这个学科,所以c[j]+=s;*/
                c[j]+=s;
            else
                break;
        }
    }

思路:一个好的技巧

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 100005;

vector<int> v[N];
ll c[N];
int ru(int a, int b){return a>b;}

int main()
{
    fill(c, c+N, 0);
    int n, m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        int x, y;
        scanf("%d%d",&x, &y);
        v[x].push_back(y);
    }
    
    for(int i=1;i<=m;i++)
    {
        sort(v[i].begin(), v[i].end(), ru);//排序
        long long s=0;
        for(int j=0;j<v[i].size();j++)
        {
            s+=v[i][j];
            if(s>0)/*如果前缀和>0那么选择j个人,一定会选这个学科,所以c[j]+=s;*/
                c[j]+=s;
            else
                break;
        }
    }
    cout<<*max_element(c, c+100002)<<endl;

	return 0;
}
全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
12-08 18:59
东北大学 Java
Java抽象带篮子:外卖项目可以看看我的详细的外卖话术,里面还写了怎么描述项目,还为了提高含金量额外增加了很多技术亮点呢。另外我这边还有个7000多字的轮子项目话术,可以狠狠的速成,需要的似我
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务