上海计算机协会-10月月赛-丙组-T5-组队竞赛
组队竞赛
内存限制: 256 Mb时间限制: 1000 ms
题目描述
有nn同学想要参加小爱组建的一支信息学竞赛队伍,每位同学有能力值a_iai与热情度b_ibi。
小爱认为,如果队伍当中,能力值最大与能力值最小选手之间,能力差值大于给定XX,会导致能力差距过大、不利于团队的学习与凝聚力。因此,请你帮助小爱计算下,如何选择队伍的选手,才能使所有选手的能力差值小于等于X,且热情度最大。
输入格式
输入第一行,一个正整数nn,表示有n位选手
接下来nn行,每行两个正整数a_i,b_iai,bi表示每位选手的能力值与热情度。
最后一行,一个正整数XX,表示小爱希望的能力差值上限输出格式
输出一个整数,表示满足条件的情况下,最大热情度的值
数据范围
- 对于30\%30%的数据,1 ≤ n ≤ 1001≤n≤100
- 对于60\%60%的数据,1≤ n ≤ 10^41≤n≤104
- 对于100\%100%的数据,1≤n≤10^5,1≤d≤10^9,1≤a_i,b_i ≤ 10^9,1≤n≤105,1≤d≤109,1≤ai,bi≤109
样例数据
输入:
5
10 21
20 34
30 27
40 89
50 54
20输出:
170
说明:
选第3、4、5个选手。
能力值分别为30、40、50,不超过50-30=20给定的能力差值上限20
此时热情度为27+89+54=170
题目出处
题意大概是:在满足选中人 最大与最小相差不超过X的情况下,和最大。(我后面代码a与b数组名颠倒了,特告知)
方法1:直接爆搜,时间复杂度O(n!),实测30分。
#include <bits/stdc++.h>
using namespace std;int n,b[1000010],a[1000010],ans,y;void dfs(int x,int s,int a1,int a2){if(x==n){if(s>ans)ans=s;return;}for(int i=x+1;i<=n;++i){int ltv=a1,lvt=a2;if(b[i]-ltv>y||lvt-b[i]>y)continue;//不满足,跳过if(b[i]<ltv)ltv=b[i];if(b[i]>lvt)lvt=b[i];//修改最大最小值dfs(i,s+a[i],ltv,lvt);//选中}if(s>ans)ans=s;//此时终止搜索,不再继续选return;
}int main(){cin>>n;for(int i=1;i<=n;++i)cin>>b[i]>>a[i];cin>>y;for(int i=1;i<=n;++i)dfs(i,a[i],b[i],b[i]);cout<<ans<<endl;return 0;
}
但是有太多没必要的搜索了,需要优化。(就不详细讲了)
方法2:先冒泡排序,再计算可取到的最大和,可以避免无谓的时间浪费。实测60分。
#include <bits/stdc++.h>
using namespace std;int n,b[1000010],a[1000010],ans=-1,y;int main(){cin>>n;for(int i=1;i<=n;++i)cin>>b[i]>>a[i];cin>>y;for(int i=1;i<=n;++i)for(int j=1;j<=n-i;++j)if(b[j]>b[j+1]){swap(a[j],a[j+1]);swap(b[j],b[j+1]);}//排序for(int i=1;i<=n;++i){int ss=0;//用于计算和for(int j=i;j<=n;++j){if(b[j]-b[i]>y)break;//差大于y,跳出ss+=a[j];}if(ss>ans)ans=ss;}cout<<ans<<endl;return 0;
}
方法3:优化2号方案,维护前缀和,减少枚举。期望得分:100分,实测60分。
#include <bits/stdc++.h>
using namespace std;int n,b[1000010],a[1000010],ans=-1,y;int main(){cin>>n;for(int i=1;i<=n;++i)cin>>b[i]>>a[i];cin>>y;for(int i=1;i<=n;++i)for(int j=1;j<=n-i;++j)if(b[j]>b[j+1]){swap(a[j],a[j+1]);swap(b[j],b[j+1]);}int s=1,ss=0;for(int i=1;i<=n;++i){for(int j=s;j<=n;++j){if(b[j]-b[i]>y){s=j;//记下编号break;}if(j==n)s=n+1;//枚举到尽头特判标记ss+=a[j];//加上新的a_j}ss-=a[i-1];//减去超出范围的a_iif(ss>ans)ans=ss;}//总的来说是维护前缀和cout<<ans<<endl;return 0;
}
实测仍是60分。呜呼!!!
问题在哪???一看,前面的冒泡直接超了,后面的优化自然也没有意义了。
何以解忧???唯有sort。
…………但是无法用其给二维数组排序,所以要动用结构体了
方法4:用结构体以使用时间复杂度为O(n log n)的sort排序,用方案2+结构体,70分(有一个点720ms可以卡过)要注意long long,否则会爆。
#include <bits/stdc++.h>
using namespace std;long long n,ans=-1,y;struct nod{int pos,find;
};nod a[100010];bool check(nod s,nod o){return s.pos<o.pos;
}int main(){cin>>n;for(int i=1;i<=n;++i)cin>>a[i].pos>>a[i].find;cin>>y;sort(a+1,a+1+n,check);for(int i=1;i<=n;++i){long long ss=0;for(int j=i;j<=n;++j){if(a[j].pos-a[i].pos>y){break;}ss+=a[j].find;}if(ss>ans)ans=ss;}cout<<ans<<endl;return 0;
}
方法5:方案3+结构体(实测100分)
#include <bits/stdc++.h>
using namespace std;long long n,ans=-1,y;struct nod{int pos,find;//定义结构体
};nod a[100010];bool check(nod s,nod o){//因为结构体属于自定义类型,所以要写比较函数return s.pos<o.pos;//从小到大排
}int main(){cin>>n;for(int i=1;i<=n;++i)cin>>a[i].pos>>a[i].find;cin>>y;sort(a+1,a+1+n,check);//排序long long s=1,ss=0;for(int i=1;i<=n;++i){for(int j=s;j<=n;++j){if(a[j].pos-a[i].pos>y){s=j;break;}if(j==n)s=n+1;ss+=a[j].find;}ss-=a[i-1].find;if(ss>ans)ans=ss;//维护前缀和}cout<<ans<<endl;return 0;
}
上海计算机协会-10月月赛-丙组-T5-组队竞赛相关推荐
- 上海2022年10月月赛丙组 T5:组队竞赛
原题连接:上海市计算机学会竞赛平台 | YACS 一,70分的写法 先对能力值进行从小到大排序,在对热情度进行前缀和处理,再枚举区间中的开始与结束位置判断是否满足能力值最大选手的能力差值小于等于X的条 ...
- 上海市计算机学会2022年10月月赛丙组解题报告
上海市计算机学会2022年10月月赛丙组解题报告 直角三角形的判定 题目描述 给定三个正整数表示三角形的三条边,请判定它是否为直角三角形 输入格式 第一行:三个整数 a,b 与 c 输出格式 若可以构 ...
- 上海2022年11月月赛丙组
上海2022年11月月赛丙组 T1~T4略 T5 出栈序列 题目描述 给定一个长度为 n n n的.仅由小写字母组成的字符串,将其按序依次放入栈中. 请问在所有可能的出栈序列中,字典序最小的出栈序列是 ...
- 上海市计算机学会月赛 2022年9月月赛丙组
上海市计算机学会月赛 2022年9月月赛丙组 这次题目真的衡水 矩形的周长与面积 机会成本 三色排序 阶乘尾数 前序中序转后序 这次题目真的衡水 文章拖了好久忘记发了 明天初赛祝各位考试顺利有一个好的 ...
- 上海市计算机学会月赛 2022年7月月赛丙组
上海市计算机学会月赛 2022年7月月赛丙组 水仙花指数 因数之和 观光电梯 匹配括号(三) 打印六芒星 本文仅供学术探讨 水仙花指数 内存限制: 256 Mb时间限制: 1000 ms 题目描述 定 ...
- 上海市计算机学会竞赛平台.2023年1月月赛丙组
T1 实验日志 题目描述 小爱正在完成一个物理实验,为期n天,其中第i天,小爱会记录 a i a_i ai 条实验数据在实验日志中. 已知小爱的实验日志每一页最多纪录m条数据,每天做完实验后他都会将 ...
- 上海11月月赛乙组解题报告
上海11月月赛乙组解题报告 1.数对统计 题目描述 给定 n 个数字 a1,a2,--,an,请从中挑选两个数字,并按原顺序组成一个数对.请问能选出多少种不完全相等的数对? 输入格式 第一行,单个整数 ...
- 上海11月份计算机方面的会议,计算机类 | 10月截稿会议信息6条
原标题:计算机类 | 10月截稿会议信息6条 ITCE 2019 INTERNATIONAL CONFERENCE ON INNOVATIVE TRENDS IN COMPUTER ENGINEERI ...
- 上海市青少年算法月赛丙组—目录汇总
上海市青少年算法2023年6月月赛(丙组) T1 差分求和 T2 二进制异或 T3 颜文字 T4 选取子段(二) T5 观光单车 上海市青少年算法2023年5月月赛(丙组) T1 三角形 ...
最新文章
- 网站性能优化的常用方法
- JSONP实现Ajax跨域请求
- webpack打包生成的map文件_从这十几个方面优化你的 Webpack 配置
- 难题:嵌套computeIfAbsent
- LTE学习:PDCCH信道
- java中的.take(),Rxjava2~take~timer~interval~buffer~filter等源码如何实现(你应该懂的)~学渣带你扣rxjava2...
- 关于抽象和多态的总结
- 使用swift集成移动广告聚合平台
- kali2020.3 安装IDA freeware
- 傅里叶变换及其实现(MATLAB)
- Java 从入门到放弃?
- Java 按照拼音排序方法
- 常用的几种视频格式(最详细的解释)
- linux网络端口失效( Device eth0 does not seem to be present,delaying initialization)解决方法
- 有没有一款手机桌面便签软件?真正好用的便签软件推荐
- 斯坦福 机器学习-第一章监督学习
- 2018安徽省考c语言笔试答案,2018年安徽公务员考试行测真题解读
- cf Educational Codeforces Round 49 D. Mouse Hunt
- 华硕ubuntu安装
- SVM分类,一对多;