首页 > 其他分享 >CF1886E I Wanna be the Team Leader

CF1886E I Wanna be the Team Leader

时间:2023-10-13 13:23:45浏览次数:30  
标签:ch CF1886E 项目 int 程序员 le maxn Wanna Leader

贪心 #动态规划

Question

Monocarp 是一家大型 IT 公司的负责人

他有 \(m\) 个项目个项目需要完成,第 \(i\) 个项目的难度为 \(b_i\)

他的团队离有 \(n\) 个程序员,第 \(j\) 个程序员的耐受能力为 \(a_j\)

Monocarp 需要分配这些项目,需要满足

  • 每个程序员最多分配 \(1\) 个项目
  • 每个项目至少需要分配给一个程序员
  • 如果有 \(k\) 个程序员分配给第 \(i\) 个项目,那么每个程序员的容忍值不能小于(可以大于等于) \(\frac{b_i}{k}\)

帮助 Monocarp 有效的分配这些项目,如果有多个答案,输出任意一个即可

\((1 \le n 2\times 10^5; 1 \le m \le 20)\)

Solution

由于一段程序中最弱的那个程序员的 \(a_j\) 不能低于 \(\frac{b_i}{k}\) ,所以贪心的思想,我们把程序员按照 \(a_j\) 从大到小排序后,一段程序的程序员肯定是连续的

image.png

然后考虑程序的排序,发现 \(m\) 特别的小,自然而然想到状态压缩DP

定义 \(F[s]\) 表示当前程序的状态是 \(s\) 需要的最少程序员个数(从大到小排序后)

考虑如何转移,对于每个新加进来的项目 \(i\) 下一个状态就是 \(s|(1<<i)\)

那么,对于每个项目,需要从上一个 \(F[s]\) 往后找,找一段区间 \([l,r]\),使得 \(b[r]>a[i]/(r-l+1)\) ,然后把这个 \(r\) 赋值给 \(F[s|(1<<i)]\) ,此时的时间复杂度是 \(nm\times 2^m\)

考虑如何优化,其实对于每个项目 \(i\) 从第 \(j\) 个程序员开始,到那个程序员结束是可以预处理出来的,因为对于一个区间 \([l,r]\) 当 \(l\) 增加的时候 \(r\) 必然不会减小

题中,我定义了 \(mn[i][j]\) 表示第 \(i\) 个项目,前面的项目已经用了 \(j\) 个程序员的所需程序员最少人数

Code

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int N,M;
int F[1<<19+5],mn[25][maxn],lst[1<<19+5];
inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
    while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}
int a[maxn],id[maxn],b[25],INF;
vector<int> ans[maxn];
bool cmp(int i,int j){return a[i]>a[j];}
int main(){
    // freopen("E.in","r",stdin);
    // freopen("E.out","w",stdout);
    N=read();M=read();
    for(int i=1;i<=N;i++) a[i]=read(),id[i]=i;
    for(int i=1;i<=M;i++) b[i]=read();
    sort(id+1,id+1+N,cmp);
    
    memset(F,127,sizeof F);INF=F[0];
    for(int i=1;i<=M;i++){
        int r=1;
        for(int l=0;l<=N;l++){
            r=max(r,l+1);
            while(r<=N&&a[id[r]]*(r-l)<b[i]) ++r;
            mn[i][l]=(r==N+1?INF:r);
        }
    }
    
    F[0]=0;
    for(int s=0;s<(1<<M);s++)if(F[s]!=INF)
        for(int i=1;i<=M;i++)
            if(!((s>>(i-1))&1)&&F[s|(1<<(i-1))]>mn[i][F[s]]){
                F[s|(1<<(i-1))]=mn[i][F[s]];
                lst[s|(1<<(i-1))]=s;
            }
    
    if(F[(1<<M)-1]==INF){printf("NO\n");return 0;}
    printf("YES\n");
    
    int now=(1<<M)-1;
    while(now){
        int i=__builtin_ctz(now^lst[now]);
        for(int j=F[lst[now]]+1;j<=F[now];j++)
            ans[i+1].push_back(id[j]);
        now=lst[now];
    }
    for(int i=1;i<=M;i++){
        printf("%d",ans[i].size());
        for(int x:ans[i]) printf(" %d",x);
        printf("\n");
    }
    return 0;
}

Summary

  • 看到 \(m \le 20\) 自然而然想到状压DP

  • __builtin_ctz(x) 返回 \(x\) 的二进制下末尾的 \(0\) 的个数

标签:ch,CF1886E,项目,int,程序员,le,maxn,Wanna,Leader
From: https://www.cnblogs.com/martian148/p/17761863.html

相关文章

  • 研发团队绩效考核:Leader 如何做到赏罚分明?
    今天话题的主题是Leader如何在绩效考核中做到赏罚分明?作者是苏宁金科CTO肖军要想做到赏罚分明就需要先明确:什么人因为做了什么事,基于什么量化指标和规则,获得什么权益或处罚。技术考核很难落地,有三个原因难以找到关键指标团队成员难以分配绩效权重考核结果难以强应用难以找到关键......
  • 【项目实战】Kafka 的 Leader 选举和负载均衡
    ......
  • MIT 6.5840 Raft Implementation(2A, Leader Election)
    Raft实现思路+细节2A任务分解总体来说,2A中主要的任务就是选出领导人,在选出领导人的时候,我们要遵循下图。在2A中,由于并没有出现日志复制,所以我们只需要考察两者的任期是否相等,以及接收者在本轮任期中有没有投票即可。因而我们可以这样地给出2A中的实现内容:完善GetState()......
  • 六年Android开发从组员到Leader的心路历程分享
    前言在互联网工作的这些年,大厂和小厂都待过,也接触过各种各样的管理者和组员,直到近两年自己开始成为技术Leader,算是在两种角色上都有些切身的心得体会,这里给大家分享下,希望能给大家的职场工作带来一些启发。简单说明下,在毕业不久加入阿里的第一年,团队大概十几个人,作为三个新人之一,......
  • 一文通吃:从 ZooKeeper 一致性,Leader选举讲到 ZAB 协议与 PAXOS 算法(下)
    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"或慕课网公众号!作者:大能|慕课网讲师上篇文章,我们介绍了ZooKeeper集群保证数据一致性和Zookeeper集群Leader选举,这边文章我们接着介绍ZAB协议和Paxos算法ZAB协议在ZooKeeper在处理事务型请求的时候有提到......
  • kafka的leader,follow,offset
     1.partition分为主从。2.当需要严格顺序时(比如秒杀场景),每个topic里面只能有一个partition,这样可以严格保证顺序。虽然多个partition时也可以保证partition内部是顺序执行的,但是不能保证整体是顺序执行的。3.同一个partition只能由一个消费者。就像一个椅子里只能坐一个人,咋......
  • nacos服务下线操作时报错:The Raft Group [naming_instance_metadata] did not find th
    【问题描述】caused:errCode:500,errMsg:dometadataoperationfailed;caused:com.alibaba.nacos.consistency.exception.ConsistencyException:TheRaftGroup[naming_instance_metadata]didnotfindtheLeadernode;caused:TheRaftGroup[naming_instance_metad......
  • 一文通吃:从 ZooKeeper 一致性,Leader选举讲到 ZAB 协议与 PAXOS 算法(上)
    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"或慕课网公众号!作者:大能|慕课网讲师本文将从ZooKeeper集群如何保证一致性,讲到zookeeper保证数据一致性的协议,然后展开讲Zookeeper集群Leader选举,包括集群三种节点的类型,ZAB协议中节点的四种状态,以及两种......
  • kafka集群是如何选择leader,你知道吗?
    前言kafka集群是由多个broker节点组成,这里面包含了许多的知识点,以下的这些问题你都知道吗?你知道topic的分区leader是怎么选举的吗?你知道zookeeper中存储了kafka的什么信息吗?起到什么做呢?你知道kafka消息文件是怎么存储的吗?如果kafka中leader节点或者follower节点发生故障,消......
  • 2017年全国大学生信息安全竞赛---wanna to see your hat?
    ======================================个人收获:1.SQL注入语句中用/**/代替空格  (虽然之前就知道)    =========================================  题目界面:  常规的点击连接查看页面看到接下来几个页面 没有什么特别的发现,同时也查看了网页的源码也没有什么发现。......