题目的链接:Problem - 580B - Codeforces;
题意为:Kefa有n个朋友,如果Kefa邀请那个朋友一定会同意去这个餐厅,给一个数的d,每个好朋友都有两个属性金钱和关系度(均小于等于1e9)。如果两个朋友的金钱数的差值大于d,则两个朋友之一不会被邀请,最终输出最大友情因子;(1<=n<=1e5,1<=d<=1e9);
并且这个最大值可能大于int的范围,需要定义成long long int。
可以先用sort给数组进行排序,接着进行历遍,判断后面的元素是否大于等于d,如果大于总数就减去开始的第一个朋友的友情,如果小于就加上这个朋友的友情,然后判断哪次值最大就是最终答案。
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
int n, d;
ll ans = 0,s=0,f=0;
pair<int, int>a[100005];
cin >> n >> d;
int i;
for (i = 0; i < n; i++)
{
cin >> a[i].first >> a[i].second;
}
sort(a, a + n);//对pair数组进行sort排序默认对first进行排序。
for (i = 0; i < n;)
{
if (a[i].first - a[s].first>= d)
{
ans -= a[s].second;
s++;
}
else
{
ans += a[i].second;
i++;
}
f = max(ans, f);//原来的总数和改变之后的数比较哪个大
}
cout << f << endl;
return 0;
}