题解CF1133E K Balanced Teams

题目:CF1133E K Balanced Teams

拿到手第一想法就是算一下每个人可以和他分一起的,然后贪心。很显然在1s内被自己hack。所以贪心不行优先考虑dp。看到n和k的范围明显是个O(n^2)的dp。

由于我们不考虑顺序,按常规把水平排个序。

我的最初想法:

设f[i][j]:前i个人分了j组的最大和。

1.h[i]-h[lst]<=5 我们可以把他分到j-1组也可以分到第j组

2.h[i]-h[lst]>5 只能把i分到第j组

但我们遇到一个问题,就是我们不清楚第j-1组的开头到底是哪个。所以我又重新思考了一下:

f[i][j]=Max(f[i-1][j],f[lst][j]+i-lst);

此处的lst是最早的可以和i分到一组的,这样可以保证答案最大。

然后由于a[i]是升序的,这次的lst直接从上次的往后移就行。

原文地址:https://www.cnblogs.com/Kylin-xy/p/11698461.html

时间: 2024-10-12 15:35:19

题解CF1133E K Balanced Teams的相关文章

【CF1133E】K Balanced Teams(动态规划,单调队列)

[CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素可以被分组. 题解 设\(f[i][j]\)表示把前\(i\)个数分成\(j\)组的最多人数. 然后单调队列转移一下完了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring&g

CF #544 div3 E. K Balanced Teams

题意:有n个学生 要求组成k个小组 每个小组中两两差值不得超过5 可以有学生不被编入组中 求最多可以有多少个学生被编入组中 n,k<=1e5 题解: 考虑dp[i][j],i为前i个学生,j为分了几组的最大人数,不选第i个人,dp[i][j]=dp[i-1][j], 选第i个人,贪心的选择距离a[i]小于等于5的最远那个点-1,记作pos[i],dp[i][j]=dp[pos[i]][j-1]+i-pos dp[i][j]=max(dp[i-1][j],dp[pos[i]][j-1]+i-pos

codeforces 1133E K Balanced Teams

题目链接:http://codeforces.com/contest/1133/problem/E 题目大意: 在n个人中找到k个队伍.每个队伍必须满足最大值减最小值不超过5.求满足条件k个队伍人数的总和的最大值. 这个题写DP很多的人应该可以很快写出来吧,毕竟不是很难. 思路: 反正最多n^2种状态.用数组存就好了. 先排序. 对于每个点,dp[a][b].表示a到n区间里分b个队伍的答案. 如果a是答案dp[a][b]所需要的,那么我们从a开始到a+i暴力一下(此时,x[a+i]-x[a]>

[LeetCode 题解]: Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 题意:对k个有序的链表进行归并排序.并分析其复杂度. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(N

题解——UVA11997 K Smallest Sums

题面 背景 输入 输出 翻译(渣自翻) 给定K个包含K个数字的表,要求将其能产生的\( k^{k} \)个值中最小的K个输出出来 题解 k路归并问题的经典问题 可以转化为二路归并问题求解 考虑A[],B[]两个有序数组 使用堆,记录一些二元组\( (x,y) \),x表示值,y表示对应的b的下标,因为我们是把b合并到a上,所以我们能够根据记录的下标推出后面的值 然后两两合并 所以就很简单 放代码 #include <cstdio> #include <algorithm> #inc

Balanced Teams (USACO Jan Bronze 2014)

既然是bronze,毫无压力的AC了. 就是个深搜,当然加个剪枝--最后一个组不用搜. 恩可以一个一个组分层次dfs,这样会跑得飞起~~也不容易错 #include <cstdio> int f[13],i,su,tt1,tt2,lev[4],min; bool has[13]; inline int md(int a,int b,int c,int d){ tt1=a,tt2=a; if(tt1<b)tt1=b; if(tt1<c)tt1=c; if(tt1<d)tt1=d

leecode 题解 || Merge k Sorted Lists 问题

problem: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Tags Divide and Conquer Linked List Heap 合并K个已序单链表 thinking: (1)题目没有要求不能够新开ListNode,所以暴力破解法:提取K个list的keyword.排序.新建结点插入.这样的情况对原list是否排好序没有要求. 排

题解-Atcoder_agc005D ~K Perm Counting

Problem AtCoder-agc005D 题意概要:给出\(n,k\),求合法的排列个数,其中合法定义为任何数字所在位置与自身值差的绝对值不为\(k\)(即求排列\(\{A_i\}\),使得\(\forall i\in[1,n],|a_i-i|\not =k\) Solution 刚看这道题时除了全集取反搞容斥外没有任何思路啊 \(f_i\)表示排列中至少有\(i\)对冲突的方案数,一对冲突定义为存在一个\(i\)使得\(|a_i-i|=k\) 考虑全集取反,加上一点点容斥思想可得 \[A

[codevs1157]2^k进制数

[codevs1157]2k进制数 试题描述 设r是个2k 进制数,并满足以下条件: (1)r至少是个2位的2k 进制数. (2)作为2k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w. 在这里,正整数k(1≤k≤9)和w(k<w≤30000)是事先给定的.问:满足上述条件的不同的r共有多少个?我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个"0"或"1"组成),S对应