一、题目链接

https://codeforces.com/problemset/problem/1133/E

二、思路

显然要使用dp,因为中间有部分人不会选取。

令$dp[i][j]$表示在前$i$个人里面选择j组所能得到的最大人数。接下来就是0-1背包思想了。

对于第$i$个人,如果不选,那么$dp[i][j]=max(dp[i][j],dp[i-1][j])$;

如果选,那么$dp[i][j]=max(dp[i][j],dp[k][j-1]+i-k),0 \le k < i$。

这转移方程的时间复杂度是$O(N^3)$,显然会超时。

注意到,如果$a[i]==a[i-1]$,如果选择了$a[i-1]$,那么$a[i]$一定会选择。否则$a[i]$一定不会被选择。也就是说,如果两个人的数值相同,要么这两个人同时被选,要么同时都不被选。那么,可以对整个$a$数组去重,并记录每个数值代表的人数。令$a'$为去重后的数组,对于去重后的数组$a'$,上述式子$k$的选取不超过$5$,然后,把转移的代价由$i-k$改为$\sum\limits_{x=k+1}^{i}cnt[a'[x]]$即可。

三、代码

#include<bits/stdc++.h>

using namespace std;
;
int n, k;
int a[N];
int dp[N][N];
unordered_map<int, int> cnt;

int main() {
    cin >> n >> k;
    ; i < n; ++i)scanf("%d", a + i), cnt[a[i]]++;
    sort(a, a + n);
    int m = unique(a, a + n) - a;
    ; i < m; ++i) {
        ; j <= k; ++j) {
            ;
            ; x--) {
                )break;
                cc += cnt[a[x]];
                )dp[i][j] = max(dp[i][j], dp[i - ][j]);
                )dp[i][j] = max(dp[i][j], dp[x - ][j - ] + cc);
                )dp[i][j] = max(dp[i][j], cc);
            }
        }
    }
    cout << dp[m - ][k] << endl;
    ;
}
/*

 6 1
 2 7 12 13 14 12

 11 4
 2 7 13 12 15 17 23 24 25 31 36

 7 2
 2 4 10 11 17 18 19

 7 1
 1 1 1 6 6 6 7

 11 2
 1 2 2 7 9 15 16 23 24 23 25

**/

Round544div3E(1133E)的更多相关文章

  1. codeforces 1133E K Balanced Teams

    题目链接:http://codeforces.com/contest/1133/problem/E 题目大意: 在n个人中找到k个队伍.每个队伍必须满足最大值减最小值不超过5.求满足条件k个队伍人数的 ...

  2. K Balanced Teams CodeForces - 1133E (Dp)

    题意: 给出 n 个数,选取其中若干个数分别组成至多 k 组,要求每组内最大值与最小值的差值不超过5,求最后被选上的总人数. 题解: 将a[1∼n] 从小到大排序, f[i][j] 表示到第 i 个数 ...

  3. Codeforces 1133E - K Balanced Teams - [DP]

    题目链接:https://codeforces.com/contest/1133/problem/C 题意: 给出 $n$ 个数,选取其中若干个数分别组成 $k$ 组,要求每组内最大值与最小值的差值不 ...

随机推荐

  1. mtail 提取应用日志数据到时序数据库的工具-支持prometheus

    mtail 是谷歌开源的一款很不错的应用日志提取工具,我们可以方便的用来提取应用的数据 到常见的监控系统(prometheus,stats,collectd,gragphite....) 说明: de ...

  2. 【转载】Win10桌面图标有小箭头怎么去掉?Win10去掉桌面图标小箭头的方法

    以下文章转载至系统之家 网址:http://www.xitongzhijia.net/xtjc/20190104/146560.html Win10桌面图标有小箭头怎么去掉?Win10去掉桌面图标小箭 ...

  3. Tower Defense Toolkit 学习

    代码太多,就不贴了.用到的基本已注释. 游戏中的数据存放在Resources/Database中.游戏运行时,通过Resources.Load加载 UI构成   对象池 using UnityEngi ...

  4. Bubble Sort冒泡排序

    冒泡排序是一种简单的排序算法. 它每次重复的访问过要排序的数列, 一次比较两个元素, 如果他们的顺错误, 就把他们交换过来. 下面这种图很清晰的解释了什么是冒泡算法. 具体算法描述如下: 1. 比较相 ...

  5. Hi3516CV300 sample -> region

  6. GUI相关学习资料

    分类 1,基于OS,包括windows,linux,android,ios 2,基于语言,包括c++,java,c#,javacript 3,按照技术分类,这个其实和os,编程语言分不开,大概可以分为 ...

  7. cmp命令详解

    Linux cmp命令 Linux cmp命令用于比较两个文件是否有差异.主要用来比较两个二进制文件 当相互比较的两个文件完全一样时,则该指令不会显示任何信息.若发现有所差异,预设会标示出第一个不同之 ...

  8. Vim NerdTree

    参考链接:http://yang3wei.github.io/blog/2013/01/29/nerdtree-kuai-jie-jian-ji-lu/ 切换工作台和目录 ctrl + w + h 光 ...

  9. linux与Windows使用编译区别及makefile文件编写

    一.Windows与:Linux嵌入式开发区别 Windows下编辑.编译.执行 编辑: sourceInsight:ADS: 编译:指定链接地址,指定链接顺序,编译 执行:烧写到单板再启动 Linu ...

  10. 黄聪:JQUERY的datatables插件,Date range filter时间段筛选功能

    需配合moment插件实现:http://momentjs.com/ 演示:http://live.datatables.net/zuciyawi/1/edit HTML代码 <!DOCTYPE ...