Codeforces 580B: Kefa and Company(前缀和)

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;
}
原文地址:https://www.cnblogs.com/Friends-A/p/10324455.html