给出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;
}

  

UVA 11997 The K smallest Sums的更多相关文章

  1. UVA - 11997:K Smallest Sums

    多路归并 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...

  2. UVa 11997 K Smallest Sums 优先队列&amp;&amp;打有序表&amp;&amp;归并

    UVA - 11997 id=18702" target="_blank" style="color:blue; text-decoration:none&qu ...

  3. 11997 - K Smallest Sums(优先队列)

    11997 - K Smallest Sums You’re given k arrays, each array has k integers. There are kk ways to pick ...

  4. UVA-11997 K Smallest Sums

    UVA - 11997 K Smallest Sums Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & ...

  5. D - K Smallest Sums(多路归并+贪心)

    Problem K K Smallest Sums You're given k arrays, each array has k integers. There are kk ways to pic ...

  6. 【暑假】[实用数据结构]UVa11997 K Smallest Sums

    UVa11997 K Smallest Sums  题目: K Smallest Sums You're given k arrays, each array has k integers. Ther ...

  7. UVA 11997 K Smallest Sums 优先队列 多路合并

    vjudge 上题目链接:UVA 11997 题意很简单,就是从 k 个数组(每个数组均包含 k 个正整数)中各取出一个整数相加(所以可以得到 kk 个结果),输出前 k 小的和. 这时训练指南上的一 ...

  8. UVa 11997 K Smallest Sums - 优先队列

    题目大意 有k个长度为k的数组,从每个数组中选出1个数,再把这k个数进行求和,问在所有的这些和中,最小的前k个和. 考虑将前i个数组合并,保留前k个和.然后考虑将第(i + 1)个数组和它合并,保留前 ...

  9. 【UVA 11997 K Smallest Sums】优先级队列

    来自<训练指南>优先级队列的例题. 题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18702 题意:给定 ...

随机推荐

  1. pytho 基本数据类型

    1.字符串(引号) name = "........."  双引号引出来的都是字符串 name = """.........""& ...

  2. QAM格雷码映射的规则(Gray Code Mapping in QAM)

    高阶调制(QAM,MQAM)信号中做基带映射,格雷码作为一种规范的映射规则,加上I,Q方向上相邻两个星座点对应的Bit_Cluster中只有一个Bit不同,所以有方便统一的特性. 以16QAM为例,先 ...

  3. Eclipse设置自动提示代码(不用alt+/了)

    在preferences找到如图的相关位置.在输入框里把26个字母加进去,qwer...........

  4. 1.URLConnection

    //爬虫://1.请求到某个网站去//2.返回一些HTML代码//3.从HTML代码提取你想要的信息 HTML解析//4.如果这些HTML中又有你感兴趣的内容//5.递归爬取//准备好网址 URL u ...

  5. springboot2.1mysql驱动类弃用

    Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdb ...

  6. Tensorflow官方文档 input_data.py 下载

    说明: 本篇文章适用于MNIST教程下载数据集. # Copyright 2015 Google Inc. All Rights Reserved. # # Licensed under the Ap ...

  7. C语言学习巩固(泛型选择)

    在程序设计中,没有特定类型,但是一旦指定一种类型,就可以转换成指定类型的代码, 例如C++有一个关键tmeplate关键字用于声明模板,而模板的最大应用便是创建泛型算法.可惜的是c没有这个关键字 但是 ...

  8. CodeForces - 876C Classroom Watch (枚举)

    题意:已知n,问满足条件"x的各个数字之和+x=n"的x有几个并按升序输出. 分析: 1.n最大1e9,10位数,假设每一位都为9的话,可知x的各个数字之和最大可以贡献90. 2. ...

  9. Docker + Maven + Docker-compose

    前言: docker:容器化管理 maven:支持docker-maven的插件,通过 mvn clean -Dmaven.test.skip package dockerfile:build 打包命 ...

  10. mysql日常小总结(其实就今天)

    联表查询: SELECT t1.user_Name  FROM t_user AS t1   ,  t_comment AS t2 WHERE t2.user_id=t1.id 结果如图: 加上GRO ...