CF1316E 【Team Building】

状压dp,感觉比D简单

\(f[i][s]\),表示考虑前\(i\)个人,状态为\(s\)(\(s\)的第\(j-1\)个二进制位表示队员的第\(j\)个位置有没有人)的最大价值

考虑如何转移

 

如果不让第\(i\)个人当队员

  • 如果当前已选为观众的人不足\(k\)个,则一定让它当观众,那么\(f[i][s]\)由\(f[i-1][s]+a_i\)转移来,不过这样做的前提是要先把这\(i\)个人按照他们当观众时的价值排序,从而如果当前观众不到\(k\)个但不选第\(i\)个,就一定会在后面选一个\(j(j>i)\)当观众,\(a_j<a_i\),就没有选第\(i\)个优了
  • 如果已经选了\(k\)个,不能再选直接\(f[i][s]=f[i-1][s]\)

已经选了几个要通过\(s\)确定,也就是\(i-1-s\text{在二进制中1的个数}\) 个人已被选位观众

 

让第\(i\)个人当队员

枚举把\(i\)放在哪一位,如果要将他放在第\(j\)位,则需满足\(s\)的第\(j-1\)个二进制位为1(也就是当前的状态这一个位置有人),那么\(f[i][s]\)可以由\(f[i-1][s \oplus (j-1)]+s_{i,j}\)转移而来

这里异或的意义就是把\(s\)的第\(j-1\)个二进制位从1变0,被转移的状态肯定是第\(j\)个位置没人

那么就可以写出代码了,其实整个思考的最重要部分就在于把\(n\)个人排序,来实现 能被选去当观众就一定选,就能达到最优 的效果,复杂度\(O(np2^p)\)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n,p,k;
struct data{
int v,id;
LL s[10];
}a[100006];
LL f[100006][130];
inline int cmp(data aa,data aaa){return aa.v>aaa.v;}
int main(){
n=read();p=read();k=read();
for(reg int i=1;i<=n;i++) a[i].v=read(),a[i].id=i;;
for(reg int i=1;i<=n;i++)
for(reg int j=1;j<=p;j++) a[i].s[j]=read();
reg int lim=1<<p;
std::sort(a+1,a+1+n,cmp);
std::memset(f,-1,sizeof f);
f[0][0]=0;
for(reg int i=1;i<=n;i++){
for(reg int s=0;s<lim;s++){
int cnt=0;
for(reg int j=0;j<p;j++)
if(s&(1<<j)) cnt++;
int tmp=i-1-cnt;
if(tmp<k){
if(f[i-1][s]!=-1) f[i][s]=f[i-1][s]+a[i].v;;
}
else f[i][s]=f[i-1][s];
for(reg int j=1;j<=p;j++){
if((s&(1<<(j-1)))&&f[i-1][s^(1<<(j-1))]!=-1)
f[i][s]=std::max(f[i][s],f[i-1][s^(1<<(j-1))]+a[i].s[j]);
}
}
}
std::printf("%lld",f[n][lim-1]);
return 0;
}

CF1316E Team Building的更多相关文章

  1. BZOJ 4742: [Usaco2016 Dec]Team Building

    4742: [Usaco2016 Dec]Team Building Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved: 16[Su ...

  2. Spoj-BIPCSMR16 Team Building

    To make competitive programmers of BUBT, authority decide to take regular programming contest. To ma ...

  3. BZOJ4742 : [Usaco2016 Dec]Team Building

    如果我们将两个人拥有的牛混在一起,并按照战斗力从小到大排序,同时把第一个人选的牛看成$)$,第二个人选的牛看成$($的话,那么我们会发现一个合法的方案对应了一个长度为$2k$的括号序列. 于是DP即可 ...

  4. 1742. Team building(dfs)

    1742 最小的是找联通块数 最大的找环 一个环算一个 其它的数各算一个 #include <iostream> #include<cstdio> #include<cs ...

  5. [USACO 2016Dec] Team Building

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4742 [算法] 动态规划 用Fi,j,k表示约翰的前i头牛和保罗的前j头牛匹配 , ...

  6. 简单状压dp的思考 - 最大独立集问题和最大团问题 - 壹

    本文参考:CPH ,USACO Guide (大佬请越过,这是初学笔记,不要吐槽内容) 前置知识:位运算基础,动态规划基础 介绍 状态是元素的子集的动态规划算法,可以用位运算来高效的优化. 那么第一道 ...

  7. [Exchange 2013]创建约会和会议

    简介 会议和约会之间的重要区别是,会议有与会者,并且没有约会.约会和会议可以是单实例或属于重复序列,但与会者. 房间或资源中不包括约会,因为它们不需要发送一条消息.在内部,Exchange 使用相同的 ...

  8. USER STORIES AND USE CASES - DON’T USE BOTH

    We’re in Orlando for a working session as part of the Core Team building BABOK V3 and over dinner th ...

  9. 基于AWS的云服务架构最佳实践

    ZZ from: http://blog.csdn.net/wireless_com/article/details/43305701 近年来,对于打造高度可扩展的应用程序,软件架构师们挖掘了若干相关 ...

随机推荐

  1. 37.2 net-- tcp传输 ServerSocket、Socket

    一.打开server端 package day35_net_网络编程.tcp传输; import java.io.IOException; import java.io.InputStream; im ...

  2. GPS定位模块返回数据的处理

    本项目采用的是微科的VK2828U7G5LF,根据NMEA0183协议,打算采用反馈GPGLL语句来进行数据的处理. 1. 首先,本GPS模块默认的波特率是9600,因此,我们仅需要设置打开GPGLL ...

  3. SpringMVC框架详细教程(六)_HelloWorld

    HelloWorld 在src下创建包com.pudding.controller,然后创建一个类HelloWorldController: package com.pudding.controlle ...

  4. AJ学IOS(34)UI之Quartz2D画画板的实现

    AJ分享,必须精品 效果: 实现过程: 首先用storyboard搭建界面,没有什么好说的. 然后就是注意的功能了,这里用了触摸事件来搭配Quartz2D的路径来画画. 思路就是把路径放到数组中 @p ...

  5. Grafana-监控-报警-运维文档

    Grafana运维文档 2019/09/23 Chenxin Wuweiwei 参考资料 https://grafana.com/grafana https://blog.52itstyle.vip/ ...

  6. Extended Traffic LightOJ - 1074 (经典SPFA问题)

    题目大意:每一个城市都有一定的繁荣度,然后给出m条有向边i->j,定义这条边的权值为pow(arr[j]-arr[i],3),然后给你q个询问,每个询问输入一个x. 然后问你点1到x的距离,如果 ...

  7. 设计模式 - 模板方法模式详解及其在Spring中的应用

    基本介绍 模板方法模式(Template Method Pattern)也叫模板模式,它在一个抽象类中公开定义了执行它的方法的模板,它的字类可以按需重写方法实现,但调用将以抽象类中定义的方式进行. 简 ...

  8. APT32入侵我国,试图窃取COVID-19相关情报

    新闻一篇: 一直以来,APT32都以东南亚为攻击目标,并且是近几年来针对中国大陆进行攻击活动最活跃的APT攻击组织,没有之一.此次再将目标对准中国,与新冠疫情离不开关系. 4月22日,Fireye发布 ...

  9. 图数据库的内部结构 (NEO4j)

    What “Graph First” Means for Native Graph Technology Neo4j是一个具有原生处理(native processing)功能和原生图存储(nativ ...

  10. Linux-监控与安全运维之zabbix

    zabbix: Zabbix是一个开源分布式监控平台,包含诸多监控功能,用于构建一个符合企业级的监控解决方案.软件由开源社区提供开发和维护,遵循GPL协议,可以自由传播和使用,但开发团队提供收费的技术 ...