1821 最优集合
 
一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i。

给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求选择一个S2的子集S3(|S3|<=k),使得S1∪S3的优美值最大。
(集合元素可以重复)
Input
  1. 第一行一个数n,(n<=1000
  2. 接下来n行,每行描述一个集合:
  3. 第一个数m,表示集合大小,接下来m个数,表示集合中的元素(m<=1000,元素<=10^9
  4. n+2行一个数T,表示询问次数(T<=10000
  5. 接下来T行,每行3个数abk,表示指定第a个集合为S1,第b个集合为S2k的意义如题(a<=n,b<=n,k<=100,000
Output
  1. T行,每行一个数,表示对应询问所能达到的最大优美值
Input示例
  1. 2
  2. 6 1 2 3 8 15 32
  3. 6 1 1 1 1 1 1
  4. 1
  5. 1 2 3
Output示例
  1. 64
 
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #pragma comment(linker, "/STACK:102400000,102400000")
  4. #define ls i<<1
  5. #define rs ls | 1
  6. #define mid ((ll+rr)>>1)
  7. #define pii pair<int,int>
  8. #define MP make_pair
  9. typedef long long LL;
  10. const long long INF = 1e18+1LL;
  11. const double Pi = acos(-1.0);
  12. const int N = 1e3+, maxn = 1e3+, mod = 1e9+, inf = 2e9;
  13.  
  14. int a[N][N],n,T,b[N],H[N];
  15. stack <int > q;
  16. void solve(int ii,int jj,int k) {
  17. LL ans = ;
  18. int tmp1 = ;
  19. while(!q.empty()) q.pop();
  20. for(int i = ; i <= a[ii][]; ) {
  21. if(ans + >= a[ii][i]) {
  22. ans += a[ii][i];
  23. ++i;
  24. }
  25. else{
  26. if(!k) break;
  27. if(q.empty()) break;
  28. while(!q.empty() && k) {
  29. ans += q.top(),q.pop(),k--;
  30. break;
  31. }
  32. }
  33. for(int j = tmp1; j <= a[jj][]; ++j) {
  34. if(ans + >= a[jj][j]) {
  35. q.push(a[jj][j]);
  36.  
  37. tmp1 = j+;
  38. }
  39. else break;
  40. }
  41. }
  42. while(!q.empty() && k) {
  43. ans += q.top();
  44. q.pop();
  45. k--;
  46. }
  47. printf("%lld\n",ans);
  48. }
  49.  
  50. int main() {
  51. scanf("%d",&n);
  52. for(int i = ; i <= n; ++i) {
  53. scanf("%d",&a[i][]);
  54. for(int j = ; j <= a[i][]; ++j) {
  55. scanf("%d",&a[i][j]);
  56. }
  57. sort(a[i] + , a[i] + a[i][] + );
  58. }
  59. scanf("%d",&T);
  60. while(T--) {
  61. int i,j,k;
  62. scanf("%d%d%d",&i,&j,&k);
  63. solve(i,j,k);
  64. }
  65. return ;
  66. }


    

51NOD 1821 最优集合 栈的更多相关文章

  1. 51NOD 1821 最优集合 [并查集]

    传送门 题意: 一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个 ...

  2. 51nod 1821 最优集合(思维+单调队列)

    题意:一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求 ...

  3. stack 集合栈计算机 (摘)

    有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入 ...

  4. 集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)

    集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096) 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该 ...

  5. uva 12096 - The SetStack Computer(集合栈)

    例题5-5 集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096) 有一个专门为了集合运算而设计的"集合栈"计算机. ...

  6. UVA12096 集合栈计算机(map和vector实现双射关系+集合的交并运算的STL)

    题目大意: 对于一个以集合为元素的栈,初始时栈为空. 输入的命令有如下几种: PUSH:将空集{}压栈 DUP:将栈顶元素复制一份压入栈中 UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果 ...

  7. UVa - 12096 集合栈计算机(STL)

    [题意] 有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两 ...

  8. 5_5 集合栈计算机(UVa12096)<stack与STL其他容器的综合运用>

    有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始化为空的栈,并支持以下操作:( 维护 N(1≤N≤2000) 个操作, 可能的五种操作如下:) ■PUSH: 在栈顶加入一个空集合 A= ...

  9. 集合栈 牛客网 程序员面试金典 C++ Python

    集合栈 牛客网 程序员面试金典 C++ Python 题目描述 请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈.该数据结构应支持与普通 ...

随机推荐

  1. CSS3---关于背景

    1.background-origin:设置元素背景图片的原始起始位置. background-origin : border-box | padding-box | content-box;    ...

  2. Java:获取IP地址

    文章来源:https://www.cnblogs.com/hello-tl/p/9139323.html import java.net.InetAddress; import java.net.Un ...

  3. 昨天去面试,这5个Python面试题都被考到了,Python面试题No6

    第1题:字符串的拼接–如何高效的拼接两个字符串? 字符串拼接的几种方法 加号 逗号 直接连接 格式化 join 多行字符串拼接() 加号 print('Python' + 'Plus') 逗号 pri ...

  4. Github 多账号配置

    1. 不同账户,生成不同密钥ssh-keygen -t rsa -f github1 -C "xxx@163.com"ssh-keygen -t rsa -f github2 -C ...

  5. linux中.bashrc 等文件中的rc是什么意思

    英文原义:RC (run command)中文释义:含有程序(应用程序甚至操作系统)启动指令的脚本文件 注 解:这一文件在操作系统启动时会自动执行,它含有要运行的指令(命令或其它脚本)列表. 相当于w ...

  6. Leetcode 236.二叉树的最近公共祖先

    二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x ...

  7. 【随机化算法】codeforces Matrix God

    http://codeforces.com/gym/101341 [题意] 给定三个方阵A,B,C,问AB=C是否成立? 方阵的规模最大为1000 [思路] 求AB的时间复杂度为n*n*n,会超时 左 ...

  8. hdu 3732

    #include<stdio.h> #include<string.h> int n,m,dp[10001]; int max(int a,int b) {  return a ...

  9. Postman调试依赖登录接口的3种方法

    在接口测试种, 我们经常会遇到有些接口登录后才能访问.我们在使用Postman调试这种接口时一般有3种方法: 依次请求 如果有登录接口的文档,或者通过抓包比较容易抓出登录请求的参数和格式,可以先使用P ...

  10. XCode warning:“View Controller” is unreachable because it has no entry points

    Unsupported Configuration: “View Controller” is unreachable because it has no entry points, and no i ...