尺取法--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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值