题意: 给出n个学生 m类题目 每个人会做s[i]类的题 并且做这个题的能力为r[i]  组成一个竞赛队 要求可以选择一些题目  在竞赛队中 擅长每一个题目的

  人数要均等  求max(sigma(r[i]))

  思路:贪心思想  每类题目选k个学生 先对每一类学生的能力值排序   如果这k个学生的能力值大于0 就选上 一开始写的是类似扫描的思想  从k从1---max(擅长一类题目的学生) 然后把他们前k个相加

  如果擅长其中一类题目的sum<=0或者没有k个学生擅长该类题目就忽略  这样在枚举的时候就会爆炸T O(n*m) 换一个想法 用填表的思想ans[i]表示选取i个学生时候的max(sigma(r[i])) 每次枚举一类 如果

  前缀和sum大于0就把它填在适当的ans[i]中  这样复杂度就为O(nlogn+m)

  此题注意扫描不行就换填表 以减少复杂度

 AC:

 #include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=2e5+;
const int inf =0x3f3f3f3f;
vector<int>v[maxn];
vector<int>sum[maxn];
bool cmp(int x,int y){
return x>y;
}
int vis[maxn];
int ans[maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
v[a].pb(b);
}
for(int i=;i<=m;i++){
sort(v[i].begin(),v[i].end(),cmp);
}
int ans1=;
int maxsize=;
for(int i=;i<=m;i++){
int sum=;
for(int j=;j<v[i].size();j++){
sum+=v[i][j];
if(sum>)ans[j]+=sum;
else break;
}
maxsize=max(maxsize,int(v[i].size()));
}
for(int i=;i<maxsize;i++)ans1=max(ans1,ans[i]);
cout<<ans1<<endl; }

  T:

 #include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=2e5+;
const int inf =0x3f3f3f3f;
vector<int>v[maxn];
vector<int>sum[maxn];
bool cmp(int x,int y){
return x>y;
}
int vis[maxn];
int ans[maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
v[a].pb(b);
}
for(int i=;i<=m;i++){
sort(v[i].begin(),v[i].end(),cmp);
}
int big=inf;
int maxsize=;
for(int i=;i<=m;i++){
int j;
for( j=;j<int(v[i].size());j++){
if(j>)
sum[i].pb(sum[i][j-]+v[i][j]);
else sum[i].pb(v[i][j]);
if(sum[i][j]<=){
break;
} }
/* if(j>0&&sum[i][j-1]>0){
sum[i].pb(-sum[i][j-1]);
}*/ maxsize=max(maxsize,int(sum[i].size()));
} int tmp=;
int ans=;
for(int i=;i<maxsize;i++){
tmp=;
for(int j=;j<=m;j++){
if(vis[j]||i>=int(sum[j].size()))continue;
if(sum[j][i]<=){
vis[j]=;
continue;
}
tmp+=sum[j][i];
}
ans=max(tmp,ans);
} /*for(int i=1;i<=m;i++){
int sum=0;
for(int j=0;j<v[i].size();j++){
sum+=v[i][j];
if(sum>=0)ans[j]+=sum;
else break;
}
maxsize=max(maxsize,int(v[i].size()));
}
int ans1=0;
for(int i=0;i<maxsize;i++)ans1=max(ans1,ans[i]);*/ cout<<ans<<endl; }

C. Multi-Subject Competition 思维+前缀和+填表加减复杂度(复杂度计算错误)的更多相关文章

  1. [JZOJ5280]膜法师题解--思维+前缀和

    [JZOJ5280]膜法师题解--思维+前缀和 题目链接 暴 力 过 于

  2. Codeforces 1082C Multi-Subject Competition(前缀+思维)

    题目链接:Multi-Subject Competition 题意:给定n名选手,每名选手都有唯一选择的科目si和对应的能力水平.并且给定科目数量为m.求选定若干个科目,并且每个科目参与选手数量相同的 ...

  3. Codeforces 776C - Molly's Chemicals(思维+前缀和)

    题目大意:给出n个数(a1.....an),和一个数k,问有多少个区间的和等于k的幂 (1 ≤ n ≤ 10^5, 1 ≤ |k| ≤ 10, - 10^9 ≤ ai ≤ 10^9) 解题思路:首先, ...

  4. Codeforces_776_C_(思维)(前缀和)

    C. Molly's Chemicals time limit per test 2.5 seconds memory limit per test 512 megabytes input stand ...

  5. 2019牛客多校训练第三场B.Crazy Binary String(思维+前缀和)

    题目传送门 大致题意: 输入整数n(1<=n<=100000),再输入由n个0或1组成的字符串,求该字符串中满足1和0个数相等的最长子串.子序列. sample input: 801001 ...

  6. atcode E - guruguru(思维+前缀)

    题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 题解:一道思维题.不容易想到类似区间求和具体看一下代码. #include <iostr ...

  7. CodeForces - 519D(思维+前缀和)

    题意 https://vjudge.net/problem/CodeForces-519D 给定每个小写字母一个数值,给定一个只包含小写字母的字符串 s,求 s 的子串 t 个数,使 t满足: 首位字 ...

  8. Spotlights【思维+前缀和优化】

    https://blog.csdn.net/mengxiang000000/article/details/53291883   原博客地址 http://codeforces.com/group/1 ...

  9. Educational Codeforces Round 102 (Rated for Div. 2) D. Program (思维,前缀和)

    题意:给你一个只含\(+\)和\(-\)的字符串,给你一个数\(x\),\(x\)初始为\(0\),随着字符串的遍历会加一减一,现在有\(m\)个询问,每个询问给出一个区间\([l,r]\)表示将这个 ...

随机推荐

  1. Dynamics CRM教程:制作普通图表并放入仪表盘中

    关注本人微信和易信公众号: 微软动态CRM专家罗勇,回复143或者20150325可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!     我有个小需求,就是看我家特 ...

  2. BIM与GIS

    BIM行业是建筑与IT结合而形成的一个新兴行业,既然能说是行业,说明它包含的内容非常丰富,懂一点和完全懂是两码事,就好像一滴水和一片大海的范围一样.现在国内有很多高校开设了BIM专业,并对口招收了学生 ...

  3. 常用Shell脚本命令(备忘)

    此处纪录一些个人常用的Shell命令,留作复用 Linux 必备软件 Tmux 终端复用神器 zsh 无比强大Shell运行环境 oh my zsh 搭配zsh食用 uGet Linux下载工具 Do ...

  4. 部署 Prometheus Operator - 每天5分钟玩转 Docker 容器技术(179)

    本节在实践时使用的是 Prometheus Operator 版本 v0.14.0.由于项目开发迭代速度很快,部署方法可能会更新,必要时请参考官方文档. 下载最新源码 git clone https: ...

  5. SQLServer之修改存储过程

    修改存储过程注意事项 只能修改先前在 SQL Server 中通过执行 CREATE PROCEDURE 语句创建的过程. Transact-SQL 存储过程修改为 CLR 存储过程,反之亦然. AL ...

  6. Linux IO 模型

    Linux 中主要有五种IO模式:阻塞IO, 非阻塞IO, IO 多路复用,信号驱动IO和异步IO; 如果从同步非同步,阻塞非阻塞角度来看,又可以分为:同步阻塞IO, 同步非阻塞IO,异步阻塞IO和异 ...

  7. Redhat安装Oracle 11g (转)

    1.1     安装前准备 1.1.1     修改操作系统核心参数 在Root用户下执行以下步骤: 1.1.1.1 修改/etc/security/limits.conf文件 输入命令:vi /et ...

  8. win10 系统 wifi自动断开连接 wifi热点不稳定

    我的系统的电脑是win10系统,笔记本 下载了一个wifi共享大师,但是wifi总是自动断,于是就找了找问题所在 在网上看了许多方案,大多数都是    在   电源管理  把[允许计算机关闭此设备以节 ...

  9. jquery datatable 实例操作

    var dataTables = $(".table").dataTable({ data: d,//为ajax的值,没有直接用插件自带的请求数据方式,个人觉得data的方式好控制 ...

  10. day15-面向对象基础(二)

    今天整理类的组合以及类的三大特性 1.类的组合 2.类的继承 3.类的封装 4.类的多态 开始今日份整理 1.类的组合 类与类之间,并不是独立的,很多的时候在正常使用的时候都是类与类之间互相调用,所以 ...