题目描述
在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和。对于给定的数阵,请你输出和前k小的取数方法。
输入输出格式
输入格式:
第一行,三个数n,m,k。
第2~n+1行,每行m个正整数
输出格式:
一行共k个数,代表在每一行取一个数前k小的加和
输入输出样例
说明
对于20%的数据,n≤8
对于100%的数据,n≤800,k≤m≤800
首先,先来考虑两行的,假设每行n个,最小的一定是a[1]+b[1],然后就有两种可能了,可能a[2]+b[1],也可能a[1]+b[2],所以两个都放进堆里,(小根堆,优先队列也是可以的,不过好像比堆要慢一点)
这样的话可能会入堆多次,就标记一下,如果标记为0,则i,j都可以加1,否则只有j能加1,就不会重复了,做一次输出一个,如果cnt==n,就做完了。
然后就是多行的了,多行的可以看做是两行做一遍结果用重新作为一行,开始把第一行与第二行做一遍,把结果放在第二行里,枚举1-n-1行,最后输出第n行前k个数即可。
5.30 随笔 over