51Nod - 1821:最优集合 (求第一个不能被表示为多个数的和的数)(不错的动脑题)
一个集合S的优美值定义为:最大的x,满足对于任意i∈1,x1,x,都存在一个S的子集S',使得S'中元素之和为i。
Input第一行一个数n,(n<=1000)
接下来n行,每行描述一个集合:
第一个数m,表示集合大小,接下来m个数,表示集合中的元素(m<=1000,元素<=10^9)
第n+2行一个数T,表示询问次数(T<=10000)
接下来T行,每行3个数a,b,k,表示指定第a个集合为S1,第b个集合为S2,k的意义如题(a<=n,b<=n,k<=100,000)OutputT行,每行一个数,表示对应询问所能达到的最大优美值Sample Input
2
6 1 2 3 8 15 32
6 1 1 1 1 1 1
1
1 2 3
Sample Output
64
题意:给出N个数列。Q次询问,每次询问形如(a,b,k),表示选定第a个数列,然后在b数列里选择k个数,使得ans最大,满足1到ans都可以被表示为这些选择的数的和的形式。
思路:先看子问题:给定一个数列,如何求最大的ans; 假设已经选出一些数,ans=[1,x],如现在给出一个数t<=x+1,那么ans=[1,x+t],负责ans不变。
所以现在即是排序,求出每个集合是ans,然后考虑在b数列选择最大的数t<=ans+1,更新ans=ans+t;同时,a数列的数可以随便选。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int a[maxn][maxn],ans[maxn],pos[maxn];
void read(int &x){
x=; char c=getchar();
while(c>''||c<'') c=getchar();
while(c>=''&&c<='') x=(x<<)+(x<<)+c-'',c=getchar();
}
int main()
{
int N,Q,x,y,k,i,j;
read(N);
for(i=;i<=N;i++){
read(a[i][]);
for(j=;j<=a[i][];j++)
read(a[i][j]);
}
for(i=;i<=N;i++){
sort(a[i]+,a[i]+a[i][]+);
for(j=;j<=a[i][];j++){
if(a[i][j]<=ans[i]+) pos[i]=j, ans[i]+=a[i][j];
else break;
}
}
scanf("%d",&Q);
while(Q--){
read(x); read(y); read(k);
int res=ans[x];
priority_queue<int>q;
int np=upper_bound(a[y]+,a[y]+a[y][]+,res+)-a[y],tk=k;
for(i=np-;i>=&&tk;i--){
q.push(a[y][i]); tk--;
} //先挑大的选,这样k后面几个就可以不加进来。 是个小小的优化。
i=np;
int tp=pos[x];
while(k--&&!q.empty()){
res+=q.top();q.pop();
while(tp+<=a[x][]&&a[x][tp+]<=res+) tp++,res+=a[x][tp];
for(;i<=a[y][];i++)
if(a[y][i]<=res+) q.push(a[y][i]);
else break;
}
printf("%d\n",res);
}
return ;
}
51Nod - 1821:最优集合 (求第一个不能被表示为多个数的和的数)(不错的动脑题)的更多相关文章
- 51NOD 1821 最优集合 栈
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,以及一个 ...
- 51nod 1821 最优集合(思维+单调队列)
题意:一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求 ...
- javascript集合求交集
两集合求交集 思路: 1. 每一次从B数组中取一值,然后在A数组里逐个比较,如果有相等的,则保存.该算法复杂度为 O(MN). M, N 分别为数组 A B 的长度. 2. 因为A B 都排过序,所以 ...
- 集合求交集 & 去除列表中重复的元素
集合求交集: set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} 交集:set3 = set1 & set2 print(ste3) #结果为{4,5} 或者ste1. ...
- 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线
51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...
- Uber优步北京第一组奖励政策
优步北京第一组: 定义为2015年6月1日凌晨前(不含6月1日)激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机 ...
- 6月29-7月5日成都uber优步司机第一/二/三组奖励政策明细
成都优步司机第一/二/三组奖励更新了,在写下文之前,我先吐槽一下:靠优步uber发财致富已成往事. 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全 ...
- Java面试题10(如何取到set集合的第一个元素)
1.如何取到set集合的第一个元素. public static void main(String[] args) { Set set = new HashSet(); set.add("x ...
随机推荐
- 客户端svn出现authorization failed异常
原文:https://blog.csdn.net/big1989wmf/article/details/70144470 发现,原来是 服务端上面 svnserve 这个进程没有启动起来 然后,再试一 ...
- 关于 AlphaGo 论文的阅读笔记
这是Deepmind 公司在2016年1月28日Nature 杂志发表论文 <Mastering the game of Go with deep neural networks and tre ...
- Effective Go(官方文档)笔记
Effective Go(官方文档)笔记 自己主动局部变量提升(编译期完毕?):return &...; 内置函数: new/make copy, append delete range(这是 ...
- Web知识点收集
1.微信屏蔽浏览器,打开办法: 如果微信webapp屏蔽了浏览器打开,通常是通过判断代理类型来做到的. 解决办法:进入浏览器开发者模式,修改浏览器代理为: Mozilla/5.0 (iPhone; C ...
- mysql 查询表索引的命令详解
http://hi.baidu.com/wylinux/item/cbc458c2984381300831c651查看索引命令mysql> show index from tblname;mys ...
- CrtmpServer 接收推送视频流 注册流基本流程
今天研究了CrtmpServer 将客户端推动过来的视频流注册到服务的流程,记录下来,以备后用. 图1 注册前端视频流流程
- linux find prune排除某目录或文件
http://blog.csdn.net/ysdaniel/article/details/7995681 查找cache目录下不是html的文件 find ./cache ! -name '*.ht ...
- MGTemplateEngine 模版发动机简单使用
https://github.com/nxtbgthng/MGTemplateEngine MGTemplateEngine 模版引擎 MGTemplateEngine比較象 PHP 中的 Smart ...
- 谈谈 T 型人才
谈谈 T 型人才 昨天的图片发模糊了,正好我把这个话题展开聊一聊吧.这个话题是关于复合型人才的,我把它称作 T 型人才. 「全栈」工程师 前一段时间,「全栈」工程师的概念很火,不过大多数时候,「全 ...
- javaScript和jQuery自动加载方法
一.JavaScript自动加载 ①在文本中用onload: 当页面中所有内容(包括图片)加载完后再执行onload,如下: <body onload="alert(1)"& ...