上海市计算机学会竞赛平台2022年10月月赛丙组组队竞赛
有𝑛n同学想要参加小爱组建的一支信息学竞赛队伍,每位同学有能力值𝑎𝑖ai与热情度𝑏𝑖bi。
小爱认为,如果队伍当中,能力值最大与能力值最小选手之间,能力差值大于给定𝑋X,会导致能力差距过大、不利于团队的学习与凝聚力。因此,请你帮助小爱计算下,如何选择队伍的选手,才能使所有选手的能力差值小于等于𝑋X,且热情度最大。
输入格式
输入第一行,一个正整数𝑛n,表示有𝑛n位选手
接下来𝑛n行,每行两个正整数𝑎𝑖,𝑏𝑖ai,bi表示每位选手的能力值与热情度。
最后一行,一个正整数𝑋X,表示小爱希望的能力差值上限
输出格式
输出一个整数,表示满足条件的情况下,最大热情度的值
数据范围
- 对于30%30%的数据,1≤𝑛≤1001≤n≤100
- 对于60%60%的数据,1≤𝑛≤1041≤n≤104
- 对于100%100%的数据,1≤𝑛≤105,1≤𝑥≤109,1≤𝑎𝑖,𝑏𝑖≤1091≤n≤105,1≤x≤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
详见代码:
#include <bits/stdc++.h>
using namespace std;
struct s
{
int a;
long long b;
};
struct s st[100005];
bool cmp(struct s t1, struct s t2)
{
return t1.a < t2.a;
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
scanf("%d %lld", &st[i].a, &st[i].b);
}
int x;
cin >> x;
sort(st + 1, st + n + 1, cmp);
for (int i = 2; i <= n; i++)
{
st[i].b += st[i - 1].b;
}
int pl = 1, pr = 1;
long long maxb = 0;
while (pr <= n)
{
while (st[pr].a - st[pl].a <= x && pr <= n)
{
pr++;
}
maxb=max(maxb, st[pr - 1].b - st[pl - 1].b);
while (st[pl].a == st[pl + 1].a)
{
pl++;
}
pl++;
}
cout << maxb << endl;
return 0;
}
原文地址:https://blog.csdn.net/a121677_/article/details/140495518
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!