CodeForces 580B(尺取法)

Kefa and Company

题意:Kefa这个人要去吃饭,他要邀请一些朋友一起去,他的每个朋友有两个属性金钱和关系度,要求邀请的人里边任意两个人之间的金钱差的绝对值不大于d;求被邀请的所有朋友的关系度的和的最大值。

思路:将朋友按金钱从小到大排序,然后对关系度用尺取法求得最大值 ,这里要用前缀和来求区间内的关系度的和,不然会TLE。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define FRE() freopen("in.txt","r",stdin)
#define INF 0x3f3f3f3f
#define inf 1000000000000

using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int maxn = 1e5+10;
struct Fi
{
    ll m,f;
}fp[maxn];
ll sum[maxn];
bool cmd(Fi &a,Fi &b)
{
    return a.m < b.m;
}

int main()
{
    ll n,d;
    memset(sum,0,sizeof(sum));
    scanf("%lld%lld",&n,&d);
    for(int i = 1; i <= n; i++)
        scanf("%lld%lld",&fp[i].m,&fp[i].f);

    sort(fp+1, fp+n+1, cmd);
    for(int i = 1; i <= n; i++)
        sum[i] = sum[i-1] + fp[i].f;

    int l = 1,r = 1;
    ll ans = -1;
    while(r <= n && l <= n)
    {
        if(fp[r].m - fp[l].m < d)
        {
            ans = max(ans, sum[r] - sum[l-1]);
            r++;
        }
        else
            l++;
    }
    printf("%lld\n",ans);
    return 0;
}
View Code

 

posted @ 2018-10-02 19:12  sykline  阅读(258)  评论(0编辑  收藏  举报