zoukankan      html  css  js  c++  java
  • Codeforces Round #321 (Div. 2) Kefa and Company 二分

    原题链接:http://codeforces.com/contest/580/problem/B

    题意:

    给你一个集合,集合中的每个元素有两个属性,$m_i,s_i$,让你求个子集合,使得集合中的最大m的差不超过d的情况下,s的和的最大值。

    题解:

    先排序,然后对于a[i],直接二分a[i].s+d的位置,然后维护一个前缀和,更新答案即可。

    代码:

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #define MAX_N 100005
    using namespace std;
    
    typedef long long ll;
    
    struct node{
    public:
        ll m,s;
        bool operator<(const ll &x)const {
            return m < x;
        }
    };
    
    node a[MAX_N];
    
    bool cmp(node x,node y) {
        return x.m < y.m;
    }
    
    int n;
    ll d;
    
    ll sum[MAX_N];
    
    int main() {
        cin.sync_with_stdio(false);
        cin >> n >> d;
        for (int i = 0; i < n; i++)cin >> a[i].m >> a[i].s;
        sort(a, a + n,cmp);
        sum[0] = a[0].s;
        for (int i = 1; i < n; i++)sum[i] = sum[i - 1] + a[i].s;
        ll ans = 0;
        for (int i = 0; i < n; i++) {
            int t = lower_bound(a, a + n, a[i].m + d) - a - 1;
            if (i == 0)ans = max(ans, sum[t]);
            else
                ans = max(ans, sum[t] - sum[i - 1]);
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    HTML5新媒体元素
    概述
    (一)最小可行化应用
    JSON
    ajax的工作原理
    R语言学习笔记(四)
    R语言学习笔记(一)
    转:禅道的数据库结构
    转:bug的分类和等级
    转:如何定义 Bug 的优先级
  • 原文地址:https://www.cnblogs.com/HarryGuo2012/p/4831099.html
Copyright © 2011-2022 走看看