http://codeforces.com/problemset/problem/580/B
题意:Kefa有n个朋友,要和这n个朋友中的一些出去,这些朋友有一些钱,并且和Kefa有一定的友谊值,要求这些朋友间的贫富差距(拥有的钱的数量)小于d,要求Kefa邀请出来的朋友的友谊值和最大,并输出这个最大值。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e6+10;
using namespace std;
struct wzy
{
ll friends,money;
}p[maxn];
ll sum[maxn];
//按金钱数升序排序
bool cmp(wzy u,wzy v)
{
return u.money<v.money;
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int n,d;
cin>>n>>d;
for(int i=0;i<n;i++)
cin>>p[i].money>>p[i].friends;
sort(p,p+n,cmp);
ms(sum);
// sum数组记录到达第i个朋友的友谊值的总和
sum[0]=p[0].friends;
// 对ans赋初值
ll ans=p[0].friends;
int j=0;
for(int i=1;i<n;i++)
{
// 计算友谊值的前缀和
sum[i]=sum[i-1]+p[i].friends;
ans=max(ans,p[i].friends);
// 直到金钱相差大于等于d的时候,更新ans的值
while(p[i].money-p[j].money>=d)
j++;
ans=max(ans,sum[i]-sum[j-1]);
}
cout<<ans<<endl;
return 0;
}