ZR#954 分组
ZR#954 分组
解法:
设 $ f[i][a][b] $ 表示考虑了排序后的前 $ i $ 个人,目前已经有 $ a $ 个组配好了,还有 $ b $ 个组只有组员没有组长的最小代价。转移时,考虑当前的人是作为组长,加入一个已经有组员的组,还是作为组员新建一个组即可。
然后对于有的人重要程度相同的情况,我们需要想办法继续保证组长在组员的后面。则对于重要程度相同的两个人,我们按照他们的志愿排序:先是只能当组员的,然后是都可以的,然后是只能当组长的。
时间复杂度:$ O(nk^2) $ ,可以通过前 3 个子任务。
然后因为如果 $ k \times 2 > n $ ,一定无解,所以特判一下就好了。
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
#define N 1001000
#define INF 0x3f3f3f3f3f3f3f3fll
LL n,k,f[2][1010][1010];
struct Neo {
LL w,s,p;
}a[N];
inline bool cmp(Neo x,Neo y) {
if(x.w != y.w)
return x.w < y.w;
return x.p < y.p;
}
int main() {
scanf("%lld%lld",&n,&k);
for(int i = 1 ; i <= n ; i++) {
scanf("%lld%lld%lld",&a[i].w,&a[i].s,&a[i].p);
if(a[i].p == 1) a[i].p = 3;
else if(a[i].p == 2) a[i].p = 1;
else if(a[i].p == 3) a[i].p = 2;
}
if(2 * k > n) {
puts("-1");
return 0;
//system("pause");
}
sort(a+1,a+n+1,cmp);
memset(f,0x3f,sizeof(f));
f[0][0][0] = 0;
int now = 1,las = 0;
for(int i = 1 ; i <= n ; i++) {
for(int j = 0 ; j <= k ; j++) {
for(int l = 0 ; j + l <= k ; l++) {
f[now][j][l] = f[las][j][l];
if(a[i].p < 3) {
if(l >= 1) f[now][j][l] = min(f[now][j][l],f[las][j][l - 1] + a[i].s);
}
if(a[i].p > 1) {
if(j >= 1) f[now][j][l] = min(f[now][j][l],f[las][j - 1][l + 1]+a[i].s);
}
}
}
swap(now,las);
}
if(f[las][k][0] >= INF) {
puts("-1");
return 0;
}
printf("%lld \n",f[las][k][0]);
//system("pause");
return 0;
}
ZR#954 分组的更多相关文章
- 2 weekend110的hadoop的自定义排序实现 + mr程序中自定义分组的实现
我想得到按流量来排序,而且还是倒序,怎么达到实现呢? 达到下面这种效果, 默认是根据key来排, 我想根据value里的某个排, 解决思路:将value里的某个,放到key里去,然后来排 下面,开始w ...
- Hadoop(18)-MapReduce框架原理-WritableComparable排序和GroupingComparator分组
1.排序概述 2.排序分类 3.WritableComparable案例 这个文件,是大数据-Hadoop生态(12)-Hadoop序列化和源码追踪的输出文件,可以看到,文件根据key,也就是手机号进 ...
- 一条Sql语句分组排序并且限制显示的数据条数
如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ...
- xamarin android ListView手动分组
xamarin的listview控件其实自带有分组方法,关于xamarin listview的自带分组方法请自行参考官方文档,我这里只写自己写的分组方法.xamarin自带的分组好是好,功能多,但是加 ...
- [Java Collection]List分组之简单应用.
前言 今天有一个新需求, 是对一个List进行分组, 于是便百度到一些可用的代码以及我们项目使用的一些tools, 在这里总结下方便以后查阅. 一: 需求 现在我们一个数据库表t_series_val ...
- TSQL 分组集(Grouping Sets)
分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集.使用分组集的聚合查询,返回 ...
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...
- SolrNet高级用法(分页、Facet查询、任意分组)
前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...
- MongoDB分组汇总操作,及Spring data mongo的实现
转载请在页首注明作者与出处 一:分组汇总 1.1:SQL样例 分组汇总的应用场景非常多,比如查询每个班级的总分是多少,如果用关系形数据库,那么sql是这样子的 ),class from score g ...
随机推荐
- 再谈.NET委托(delegate、Func<>)
为了演示委托,我们先来定义一个方法:public static bool IsTen(int i){ return i == 10 ? true : false;} 如果要用自定义委托,则需要声 ...
- spring 实现事务配置的方式
spring 中常用的两种事务配置方式以及事务的传播性.隔离级别 一.注解式事务 1.注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo. 2. ...
- 【数字图像处理】目标检测的图像特征提取之HOG特征
1.HOG特征 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯 ...
- leetcode-55. Jump Game · Array
题面 这个题面挺简单的,不难理解.给定非负数组,每一个元素都可以看作是一个格子.其中每一个元素值都代表当前可跳跃的格子数,判断是否可以到达最后的格子. 样例 Input: [2,3,1,1,4] Ou ...
- KVM之virsh管理虚拟机CPU
查看虚拟机CPU数量配置 [root@ubuntu ~]# virsh vcpucount centos_server01 maximum config 2 maximum live 2 curren ...
- c# 执行调用Oracle Procedure传参及回传值
////定義參數 //IDataParameter[] parameters = // { ...
- C++ ---释放内存(new和delete)
C++ ---释放内存(new和delete) C++动态分配和释放内存 @c.biancheng.net/view/206.html -------------------------------- ...
- Oracle查询表空间使用情况的一个sql
select t1.tablespace_name,curr_b/1024/1024/1024,max_b/1024/1024/1024,curr_b/max_b from(select table ...
- 直接插入排序Straight_Insertion_Sort
基本思想:简单排序的一种.如果玩过扑克牌应该都知道顺子,这时有一把顺子但是顺序是乱的,你要去按顺序整理.那第二张牌和第一张牌比较,调整顺序后前两张牌就是有序的,接着第三张牌插入前两张的有序列中,形成三 ...
- Mysql+keepalived
测试环境 192.168.2.201 master slave 192.168.2.202 master slave 配置流程:安装MySQL->优化系统->优化配置my.cnf-> ...