Description

Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's clear that we may get n ^ m this kind of sequences. Then we can calculate the sum of numbers in each sequence, and get n ^ m values. What we need is the smallest n sums. Could you help us?
Input

The first line is an integer T, which shows the number of test cases, and then T test cases follow. The first line of each case contains two integers m, n (0 < m <= 100, 0 < n <= 2000). The following m lines indicate the m sequence respectively. No integer in the sequence is greater than 10000.
Output

For each test case, print a line with the smallest n sums in increasing order, which is separated by a space.
Sample Input

1
2 3
1 2 3
2 2 3
Sample Output

3 3 4

题意:有m行数字,每行均有n个数字.从每行均取出一个数字相加,共有m^n个解,输出解最小的n个.

题解:建一个大根堆,先将第一行的全部扔进去,在全部扔回一个数组里,那么此时数组中的数是从大到小排列的.

然后这个数组,我们给它中的每一个数取出,再加上第二行的第一个数,全部扔进堆里,接着对于第2~n个数中的每一个,我们将它与数组中最小的,次小的……(数组倒过来)相加,如果和比大根堆的堆顶大,这就是我们要找的了,将堆顶弹出,将这个值插入.然而我并不知道这玩意的复杂度,居然就这么A了?真是奇怪,有信仰的话可一定要用手写堆啊!

代码如下:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define hi puts("hi");
  6. using namespace std;
  7. int map[][];
  8. struct Heap
  9. {
  10. int a[],sz;
  11. void init()
  12. {
  13. sz=;
  14. }
  15. void add(int x)
  16. {
  17. int now=sz++;
  18. while(now>)
  19. {
  20. int fa=now>>;
  21. if(a[fa]>x)
  22. {
  23. break;
  24. }
  25. a[now]=a[fa];
  26. now=fa;
  27. }
  28. a[now]=x;
  29. }
  30. int pop()
  31. {
  32. int ans=a[];
  33. int now=;
  34. int x=a[--sz];
  35. while((now<<)<sz)
  36. {
  37. int ls=now<<,rs=now<<|;
  38. if(a[ls]<a[rs]&&rs<sz)
  39. {
  40. ls=rs;
  41. }
  42. if(a[ls]<x)
  43. {
  44. break;
  45. }
  46. a[now]=a[ls];
  47. now=ls;
  48. }
  49. a[now]=x;
  50. return ans;
  51. }
  52. int top()
  53. {
  54. return a[];
  55. }
  56. int empty()
  57. {
  58. return sz==;
  59. }
  60. } heap;
  61. int main()
  62. {
  63. int t;
  64. scanf("%d",&t);
  65. while(t--)
  66. {
  67. int m,n,b[],cnt=;
  68. heap.init();
  69. scanf("%d%d",&m,&n);
  70. for(int i=; i<=m; i++)
  71. {
  72. for(int j=; j<=n; j++)
  73. {
  74. scanf("%d",&map[i][j]);
  75. }
  76. }
  77. for(int i=; i<=n; i++)
  78. {
  79. heap.add(map[][i]);
  80. }
  81. for(int i=; i<=m; i++)
  82. {
  83. cnt=;
  84. while(!heap.empty())
  85. {
  86. b[++cnt]=heap.pop();
  87. }
  88. for(int j=; j<=cnt; j++)
  89. {
  90. heap.add(b[j]+map[i][]);
  91. }
  92. for(int j=; j<=n; j++)
  93. {
  94. for(int k=cnt; k>=; k--)
  95. {
  96. if(b[k]+map[i][j]<heap.top())
  97. {
  98. heap.pop();
  99. heap.add(b[k]+map[i][j]);
  100. }
  101. else
  102. {
  103. break;
  104. }
  105. }
  106. }
  107. }
  108. cnt=;
  109. while(!heap.empty())
  110. {
  111. b[++cnt]=heap.pop();
  112. }
  113. for(int i=cnt; i>=; i--)
  114. {
  115. printf("%d ",b[i]);
  116. }
  117. printf("%d\n",b[]);
  118. }
  119. }

POJ2442 Sequence(堆的骚操作)的更多相关文章

  1. $POJ2442\ Sequence$ 堆

    正解:堆 解题报告: 传送门$QwQ$ 全场除了我都切了系列$kk$ 首先看$n=2$的情况. 首先暴力不说?就记录一个$sum$再分别记录$xy$两维的下标存到堆里面每次取队头并继续扩展就完事$Qw ...

  2. C#中的9个“黑魔法”与“骚操作”

    C#中的9个"黑魔法"与"骚操作" 我们知道C#是非常先进的语言,因为是它很有远见的"语法糖".这些"语法糖"有时过于好 ...

  3. Typescript骚操作,在TS里面直接插入HTML

    Typescript骚操作,在TS里面直接插入HTML,还有语法提示 先给大家看一个图 因为我不喜欢用很重的框架,主要是并非专业UI,但是偶尔会用到,还是觉得直接element组装受不了,想想能在ts ...

  4. 闪电侠 Netty 小册里的骚操作

    前言 即使这是一本小册,但基于"不提笔不读书"的理念,仍然有必要总结一下.此小册对于那些"硬杠 Netty 源码 却不曾在千万级生产环境上使用实操"的用户非常有 ...

  5. awk骚操作

    一.awk自加 [root@168web3 ~]# head /data/logs/cloud_monitor_rds_cpu.log |awk '{sum+=$NF}END{print sum}' ...

  6. 如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)

    0x01 问题提出 还记得上篇文章记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门),我们讲到了一些PHP的一些如何巧妙地绕过数字和字母受限的技巧,今天我要给大家分享的是如 ...

  7. UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)

    题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...

  8. 关于map 及 map 骚操作

    关于map这个东西   很冷门..................   但是,这个博客带你稍微了解一下map:   map用法:一般当作一个下表无穷大的数组   关于它的骚操作:map的鬼畜用法,可以 ...

  9. 通过HTTP的HEADER完成各种骚操作

    作为一名专业的切图工程师,我从来不care网页的header,最多关心Status Code是不是200.但是HEADER真的很重要啊,客户端从服务器端获取内容,首先就是通过HEADER进行各种沟通! ...

随机推荐

  1. MySQL插入中文时出现ERROR 1406 (22001): Data too long for column 'name' at row 1 (转)

    使用命令行方式登陆到MySQL服务器, 建立一个数据库,数据库编码设为UTF-8.此时,如果直接在命令行窗口使用insert语句插入中文,就遇到类似 ERROR 1406 (22001): Data ...

  2. Tomcat起了一个测试桩,调用该测试桩无响应

    有时在测试新业务流程时因为涉及多个不同接口的调用,而这些被调用的服务端因为网络权限或开发进度问题暂时对我们不可达,那么我们可以通过模拟接口返回来完成我们新业务的测试.这次碰到的问题是我明明起了该测试桩 ...

  3. (转)WebApi发送HTML表单数据:文件上传与多部分MIME

    5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/282 ...

  4. 【转】JMeter中使用Selenium进行测试

    JMeter是使用非常广泛的性能测试工具,而Selenium是ThroughtWorks 公司一个强大的开源Web 功能测试工具.Jmeter和Selenium结合使用,就可以实现对网站页面的自动化性 ...

  5. 1017 Queueing at Bank

    题意:银行有K个窗口用于服务,给出所有人的达到时间T和服务时间P,计算所有被服务的客户的平均等待时间.任何客户的服务时间不得超过60分钟.早于08:00到的,要等到08:00:在17:00:01及之后 ...

  6. MySQL 优化器

    (system@127.0.0.1:3306) [trunk]> show variables like '%performance_sch%';+----------------------- ...

  7. C#简单操作app.config文件

    即将操作的app.config文件内容如下 <?xml version="1.0" encoding="utf-8"?> <configura ...

  8. 分数CSD编码

    有符号数系统:有三重值(1, 0, -1) SD编码:12 = 16 - 4 = 10000_0000 - 100 = 1_0000_0(-1)00; = 16 - 9 + 5 = 1_0000_00 ...

  9. oracle查看表空间和物理文件大小

    查看各表空间的使用情况 select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/102 ...

  10. Py修行路 python基础 (十四)递归 及 面向对象初识及编程思想

    一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策略时,必须有一个明确的递归结束条件 ...