首页 > 其他分享 >CF1886E 题解

CF1886E 题解

时间:2024-05-15 16:54:48浏览次数:15  
标签:CF1886E int 题解 程序员 匹配 dp

CF1886E

思路

观察发现每个项目只与程序员数量和最小值有关,所以每个项目对应能力值连续的程序员最优。

项目数 \(m\le 20\),状压。设 \(dp_{i,s}\) 为前 \(i\) 个程序员匹配的项目状态为 \(s\) 是否可行,无法接受。交换维度,改为 \(dp_s\) 表示状态 \(s\) 能与前缀 \([1,i]\) 匹配的最小 \(i\)。

不要求全选程序员,全选不一定优。预处理 \(f_{i,s}\) 表示第 \(i\) 个项目从 \(j\) 开始匹配程序员,最少要匹配到哪里。\(f_{i,j}=\min(f_{i,j+1},j+\lceil\frac{b_i}{a_j}\rceil-1)\)。

code

int n,m;
pii a[maxn];int b[maxn];
int dp[1<<20],pre[1<<20],f[20][maxn];
pii pos[20];
void work(){
	n=read();m=read();
	for(int i=1;i<=n;i++)a[i]={read(),i};
	for(int i=0;i<m;i++)b[i]=read();
	sort(a+1,a+n+1);
	for(int i=0;i<m;i++){
		f[i][n+1]=n+1;
		for(int j=n;j;j--)f[i][j]=min(f[i][j+1],j+(b[i]+a[j].fi-1)/a[j].fi-1);
	}
	mems(dp,0x3f);dp[0]=0;
	for(int s=1;s<(1<<m);s++){
		for(int i=0;i<m;i++)if(s&(1<<i)){
			if(dp[s^(1<<i)]>=n)continue;
			if(f[i][dp[s^(1<<i)]+1]<dp[s])dp[s]=f[i][dp[s^(1<<i)]+1],pre[s]=i;
		}
	}
	if(dp[(1<<m)-1]>n){printf("NO\n");return ;}
	printf("YES\n");
	int s=(1<<m)-1;
	while(s){
		for(int i=dp[s^(1<<(pre[s]))]+1;i<=dp[s];i++)if(f[pre[s]][i]!=f[pre[s]][i+1]){
			pos[pre[s]]={i,dp[s]};
			break;
		}
		s^=(1<<pre[s]);
	}
	for(int i=0;i<m;i++){
		printf("%lld ",pos[i].se-pos[i].fi+1);
		for(int j=pos[i].fi;j<=pos[i].se;j++)printf("%lld ",a[j].se);printf("\n");
	}
}

标签:CF1886E,int,题解,程序员,匹配,dp
From: https://www.cnblogs.com/yhddd/p/18194227

相关文章

  • 旅行 题解
    题目链接。题意简述给定一张有向图,求从点\(A\)走到点\(B\)的一条路径,这条路径满足:经过的边的权值总和是\(P\)的倍数。在满足条件\(1\)的情况下,经过的边的权值总和最小。题目分析本题可以使用分层图最短路来解决。仿照动态规划的思想,定义\(f_{x,y}\)表示从节点......
  • echarts图由于容器隐藏导致图表不显示问题解决办法
    开发过程中常常会遇到echarts图由于容器隐藏导致图表不显示问题,最简单的办法就是给容器元素加上宽度和高度容器加上固定的宽度和高度<divid="res"style="height:450px;width:1200px"></div>然而在实际开发中某些场景下,要求图表宽度100%显示,而计算容器的宽度有时又会十分的麻......
  • CF1965D Missing Subarray Sum题解
    题目链接点击打开链接题目解法感觉一点都不好想\fn因为最后的序列\(a\)是回文的,所以只有以中心点对称的子段和出现次数为奇数,其他都为偶数考虑有没有什么知道所有子段和的做法,可以方便推出缺失一个的答案令\(g_{l,r}\)为\(l\)到\(r\)的子段和知道\(g_{1,n}\)删......
  • P9175 [COCI2022-2023#4] Mreža 题解
    P9175[COCI2022-2023#4]Mreža题解前言我发现,有整体二分与主席树的地方总有莫队(不是那个莫队,是那个莫队)。知识点(树上)倍增,(树上)莫队,树状数组(“树”含量满满),分块。题意分析给定一棵树,每条边有一个权值\(v\),以及可以用一个花费\(c\)将它变成更大的权值\(s\)。再给定一......
  • Little Pony and Lord Tirek 题解
    LittlePonyandLordTirek题解\(\texttt{ProblemLink}\)题目大意给定长度为\(n\)的序列,第\(i\)个数有三个值:\(s_i,m_i,r_i\),每秒对于每个数执行\(s_i\leftarrow\min\{s_i+r_i,m_i\}\)。有\(m\)个查询,每次查询三个值:\(t,l,r\)查询时刻\(t\),\([l,......
  • [H&NCTF] maybe_xor题解
    maybe_xor感觉这道逆向题与其说是考逆向水平,倒不如说是考编写脚本的能力首先题目给了个远程地址,nc连接会回显ELF:接一串base64编码的东东,解码后发现是ELF文件。用IDA打开发现是从数据段读取24个字节到栈上并进行异或,每个字节异或的值都不同,但异或后的结果不会写回栈程序的目......
  • [题解] Flipping Game
    题目描述有n盏灯,每个灯有开和关两种状态。每按一次灯会变成相反的状态。给定灯初始的开关状态和结束的开关状态,若操作k轮,每轮要按m个不同的灯,问有多少种方法使灯由初始状态变到结束状态。题解需注意每轮要按不同的灯,若无这个条件,暴力计算组合数即可。要操作多轮,且每轮按灯的......
  • 题解:SP10232 AMR11E - Distinct Primes
    前话这咋人名都和HP一模一样了,SPOJ出题人里是不是全是哈迷啊。思路非常直观的一个思路:从前往后枚举每一个数,看是否满足条件,输出满足条件的第一个。CODE#include<bits/stdc++.h>usingnamespacestd;boolis(intn){//判断质数if(n<2)return0;for(inti=2;i<......
  • 题解:CF1337A Ichihime and Triangle
    看到大佬们基本都是直接输出\(b\)\(c\)\(c\)了事儿,一身反骨有其它构造方法的我表示不服,遂作此篇。众所周知,两边之和大于第三边,所以,如果\(b+c>d\),那么\(b\)、\(c\)、\(d\)就是正确的。那如果不满足呢?在题目条件下\(b+c>b+c-1\),那么这一组就是合理的。分别验......
  • NOIP真题题解
    2001T4Car的旅行路线ybtluogu建图+最短路1.建图时细节较多已知三点求第四点的坐标勾股定理判断斜边2.最短路时多起点多终点2013D1T3货车运输ybtluogu最大生成树+倍增LCA答案的边一定在最大生成树上将原图建出最大生成树在树上使用倍增LCA提取路径2014D2T2寻......