zoukankan      html  css  js  c++  java
  • Codeforces 1133E

    题目链接:https://codeforces.com/contest/1133/problem/C

    题意:

    给出 $n$ 个数,选取其中若干个数分别组成 $k$ 组,要求每组内最大值与最小值的差值不超过5,求 $k$ 组合起来最多可以放多少个数。

    题解:

    将 $a[1 sim n]$ 从小到大排序,排序后每个组必定可以视为数组 $a$ 上一段连续区间,

    $f[i][j]$ 表示到第 $i$ 个数为止,前面组成 $j$ 组,最多可以包含多少个数。

    那么,考虑第 $i$ 个数选取与否,如果不选,那么 $f[i][j]=f[i-1][j]$;

    如果选,那么必然是第 $i$ 个数所在组人数加上前面那些组人数,假设 $p$ 表示距离 $a[i]$ 左侧最远的那个位置(满足 $a[i]-a[p] le 5$),$f[i][j]=(i-p+1)+f[p-1][j-1]$。

    AC代码:

    用lower_bound找 $p$,时间复杂度 $O(n log n + nk)$。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=5005;
    int n,k,ans;
    int a[maxn];
    int f[maxn][maxn];
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0), cout.tie(0);
    
        cin>>n>>k;
        for(int i=1;i<=n;i++) cin>>a[i];
        sort(a+1,a+n+1);
    
        ans=f[1][1]=1;
        for(int i=2;i<=n;i++)
        {
            int p=lower_bound(a+1,a+i+1,a[i]-5)-a;
            for(int j=1;j<=min(k,i);j++)
            {
                f[i][j]=max(f[i-1][j],(i-p+1)+f[p-1][j-1]);
                ans=max(ans,f[i][j]);
            }
        }
        cout<<ans<<endl;
    }

    线性维护 $p$,时间复杂度 $O(nk)$。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=5005;
    int n,k,ans;
    int a[maxn];
    int f[maxn][maxn];
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0), cout.tie(0);
    
        cin>>n>>k;
        for(int i=1;i<=n;i++) cin>>a[i];
        sort(a+1,a+n+1);
    
        ans=f[1][1]=1;
        int p=1;
        for(int i=2;i<=n;i++)
        {
            while(p<i && a[i]-a[p]>5) p++;
            for(int j=1;j<=min(k,i);j++)
            {
                f[i][j]=max(f[i-1][j],(i-p+1)+f[p-1][j-1]);
                ans=max(ans,f[i][j]);
            }
        }
        cout<<ans<<endl;
    }
  • 相关阅读:
    hdu 思维风暴
    HDU 4183Pahom on Water(网络流之最大流)
    现在仍在工作的12名最“屌”的程序猿
    安卓ContentObserver模式获取短信用正则自己主动填充验证码
    Android插件实例——360 DroidPlugin具体解释
    mysql---union的使用方法
    SICP 习题 (2.11)解题总结:区间乘法的优化
    jQuery中的ajax
    Ajax的简单总结
    jQuery插件开发
  • 原文地址:https://www.cnblogs.com/dilthey/p/10804527.html
Copyright © 2011-2022 走看看