给出K*K的矩阵,每一行取一个数,构成K个数的和,总共有 k^k种可能,从中取出前k个最小的。

一开始犯了错,因为只要对每行排序,最小的必定是第一列的和,然后我当时就想着,逐步推进,每次将某行的那个数变成其下一列那个数,当然间距要最小。我这样明显是不对的,这样的话每个数只用了一次,而题目的意思明显是可以重复多次。

然后大白上说的是把他看成两行,即每次处理两行,留下最小的k个 再与下一次读入的那一行继续处理。这个方法相当给力,不过有个难点是,怎么在两行的时候,比较快的得到前k小的,我试过全部算一遍, k^k种情况。。会超时。。之后想了很久 都没想出一个比较有效的方法,后来看到一种很叼的方法,而且很容易证明,即 先把

排完序后的 第一行的 A【0】 到 A【K-1】 分别和 第二行的B【0】组成 最早的k个数,目前只知道A【0】+B【0】是最小的,其余的还不确定,但是我可以确定的是,第二小的,一定是A【0】+B【1】或者上述k-1个数中的某一个,也就是说,我把这些数,放入优先队列里面,然后每次pop出最小的数,输出,然后把刚刚最小的数的下一个又push进队列里面,则下一个pop出来的 必定是第二小的。。。这样的话 这样 重复k次,便能得到 前k小的数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
struct node
{
int s,b;
bool operator < (const node& rhs) const{
return s>rhs.s;
}
};
priority_queue<node> q;
const int N=800;
int n;
int A[N];
int B[N];
void solve()
{
while (!q.empty()) q.pop();
for (int i=0;i<n;i++){
q.push((node){A[i]+B[0],0});
}
int cnt=0;
while (cnt<n){
node tmp=q.top();
q.pop();
A[cnt++]=tmp.s;
q.push((node){tmp.s-B[tmp.b]+B[tmp.b+1],tmp.b+1});
} }
int main()
{
while (scanf("%d",&n)!=EOF)
{
while (!q.empty()) q.pop();
for (int i=0;i<n;i++){
scanf("%d",&A[i]);
}
for (int i=1;i<n;i++){
for (int j=0;j<n;j++){
scanf("%d",&B[j]);
}
sort(B,B+n);
solve();
}
printf("%d",A[0]);
for (int i=1;i<n;i++){
printf(" %d",A[i]);
}
puts("");
}
return 0;
}

  

最新文章

  1. Android MarginEnd与MarginStart (RTL)
  2. MVC授权
  3. React Native学习笔记之1
  4. SimpleDateFormate的使用
  5. BZOJ 1115: [POI2009]石子游戏Kam
  6. 淘宝首页源码藏美女彩蛋(下)(UED新作2013egg)
  7. Ext 项目随笔
  8. Android 软键盘小知识点
  9. FAQ: Python中if __name__ == &#39;__main__&#39;:作用
  10. 使用简单的 5 个步骤设置 Web 服务器集群
  11. .net程序在无.net环境下运行
  12. linux的远程唤醒
  13. Proxy代理模式
  14. python全栈开发 * 进程池,线程理论 ,threading模块 * 180727
  15. Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
  16. 带分数|2013年蓝桥杯B组题解析第九题-fishers
  17. element-ui radio 再次点击取消选中
  18. maven 插件2
  19. 构造函数constructor 与析构函数destructor(二)
  20. 适配器在JavaScript中的体现

热门文章

  1. java string常用的占位符形式
  2. poj2236 Wireless Network(并查集直接套模板
  3. spring bean容器学习
  4. ArrayList和LinkedList、Vector的优缺点?
  5. Linux系统测试工具
  6. java实现下划线转驼峰
  7. java.io.IOException: Error: JSP Buffer overflow
  8. Windows安装tensorflow,配置vs2013,anaconda3.4,cudn9.0,cudnn7.0和pycharm
  9. IDEA快速定位一个文件到项目目录
  10. 锤子科技向OpenBSD基金会捐款195 万