51nod1821-最优集合【贪心】
正题
题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1821
题目大意
\(n\)个可重集合,\(T\)次询问,询问将集合\(S_x\)和一个选出大小为\(k\)的\(S_y\)的子集合并成的独立集\(S'\)满足能够找到一个最大的\(z\)使得对于任意的正整数\(i\in [1,z]\)都存在一个\(S'\)的子集和为\(i\)。
\(1\leq n,m_i\leq 1000,1\leq T\leq 10000\)
解题思路
考虑我们已经拼出了一个\(z\),那么我们如果加入一个\(\leq z+1\)的数\(x\)那么就可以使得上限变成\(z+x\)。
所以可以考虑贪心,因为第一个集合没有限制我们就优先选择第一个集合里的数,直到不能选择我们就选择第二个集合里的直到能够继续选择第一个集合里的。
排好序然后开个栈维护就好了。
时间复杂度\(O(nm\log m+Tm)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1100;
ll n,T,m[N],s[N],a[N][N];
signed main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld",&m[i]);
for(ll j=1;j<=m[i];j++)
scanf("%lld",&a[i][j]);
sort(a[i]+1,a[i]+1+m[i]);
}
scanf("%lld",&T);
while(T--){
ll x,y,k,z=1,top=0,sum=1,flag=0;
scanf("%lld%lld%lld",&x,&y,&k);
for(ll i=1;i<=m[x];i++){
while(z<=m[y]&&a[y][z]<=sum)s[++top]=a[y][z],z++;
while(sum<a[x][i]){
if(!k||!top){flag=1;break;}
sum+=s[top];k--;top--;
}
if(flag)break;sum+=a[x][i];
}
while(k&&top)sum+=s[top],top--,k--;
printf("%lld\n",sum-1);
}
return 0;
}
51nod1821-最优集合【贪心】的更多相关文章
- 51nod1821 最优集合 贪心
首先考虑一个集合的最大优美值怎么求出 考虑新增一个数,假设我们现在的优美值已经达到了$V$,那么只需要一个$[1, V + 1]$的数就可以使$V$达到更大 为了保证能添加尽可能多的数进来,我们这么构 ...
- 51NOD 1821 最优集合 栈
1821 最优集合 一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2, ...
- CF 672C Recycling Bottles[最优次优 贪心]
C. Recycling Bottles time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- 51NOD 1821 最优集合 [并查集]
传送门 题意: 一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个 ...
- 51nod 1821 最优集合(思维+单调队列)
题意:一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求 ...
- 51Nod - 1821:最优集合 (求第一个不能被表示为多个数的和的数)(不错的动脑题)
一个集合S的优美值定义为:最大的x,满足对于任意i∈1,x1,x,都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求选择 ...
- 胡小兔的OI日志3 完结版
胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...
- 【learning】加权拟阵与贪心
首先.. 这篇东西的话算是一个关于拟阵部分知识的小总结,有些语言相对来说偏向便于理解方面,所以可能..有一些说法会不是那么严谨大概是这样 一些概念 线性无关:一组数据中没有一个量可以写成其余量的线 ...
- 1572: [Usaco2009 Open]工作安排Job[贪心]
Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单 ...
随机推荐
- tcp为什么要三次握手,tcp为什么可靠
转自 : https://www.cnblogs.com/LUO77/p/5771237.html大体看过,没有深入研究,有需要时继续看. 为什么不能两次握手:(防止已失效的连接请求又传送到服务器端, ...
- ASP net core面试题汇总及答案
在dot net core中,我们不需要关心如何释放这些服务, 因为系统会帮我们释放掉.有三种服务的生命周期. 单实例服务, 通过add singleton方法来添加.在注册时即创建服务, 在随后的请 ...
- nodejs根据word模板生成文档
这里使用的模块是 docx-templates,直接npm安装即可[方法二:https://www.cnblogs.com/vichang/p/10416449.html] 1,模板文件 +++QU ...
- transient用法
1 import java.io.FileInputStream; 2 import java.io.FileNotFoundException; 3 import java.io.FileOutpu ...
- linux上传下载文件(转载https://www.jb51.net/article/143112.htm)
转载于:https://www.jb51.net/article/143112.htmLinux下目录复制:本机->远程服务器 1 scp -r /home/shaoxiaohu/test1 z ...
- 读《深入理解java虚拟机》小结
之所以学习 jvm ,是因为在学习多线程相关知识时,对 volatile 关键字理解的不够透彻,总有种似懂非懂的感觉.于是通过在网上各种资料的查阅,最终将 volatile 和 jvm 联系上了,本身 ...
- 阿里云服务器上部署java项目(安装jdk,tomcat)
安装JDK a.执行下面的yum指令安装,无线配置环境变量. 1.yum -y update #首先更新一下YUM源2.yum list Java* ---------#列出所有的JDK 3.yum ...
- OpenCV waitKey 无法正常捕捉方向键(上下左右),总结和解决方案,可以用waitKeyEx
在win10+python+opencv3.4.5,测试 while True: key = cv2.waitKey(0) print('key =', key) 依次按上.下.左.右方向键,输出: ...
- Core3.1WebApi使用MongoDB
好久没有使用MongoDB了,重新测试使用,版本不一样之前很多方法都使用不了了,下面为部分测试,下次再来更新测试 测试中使用的命令 // 新增读写的用户 db.createUser({ user:'f ...
- sizeof关键字
sizeof关键字 sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节 sizeof的返回值为size_t size_t类型在32位操作系统下是unsigne ...