UVA 11997 【K Smallest Sums】

【题意分析】

本题目是要求总和最小的k个值,当然我们没有必要把所有的值全部求一次,我们首先应该对每组元素进行排序。然后根据两两合并的观点节约空间(先把前两组数据合并为一组数据,最后把下面的每一组数据和之前合并所得的那组数据进行合并)。那么最后剩下的那组数据中的前k个数字就是最小的数字。

【借鉴之处】

本题采用的两两合并的观点很新颖,值得学习理解。

【AC代码】

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct  Item
{
  int s,b;
  Item(int s,int b):s(s),b(b){}
  bool operator <(const Item &a) const{
      return s>a.s;
  }
} ;
void merge(int *A,int *B,int *C,int n)
{
    priority_queue<Item>q;
    for(int i=0;i<n;i++)
    q.push(Item(A[i]+B[0],0));
    for(int i=0;i<n;i++)
    {
     Item item =q.top();q.pop();
     int b=item.b;
     C[i]=item.s;
     if(b+1<n)  q.push(Item(item.s-B[b]+B[b+1],b+1));//细细体会此处
    }
}
const int maxn=768;
int A[maxn][maxn];
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            scanf("%d",&A[i][j]);
            sort(A[i],A[i]+n);
        }
        for(int i=1;i<n;i++)
        {
            merge(A[0],A[i],A[0],n);
        }
        printf("%d",A[0][0]]);
        for(int i=1;i<n;i++)
        printf(" %d",A[0][i]);
        printf("\n");
    }
    return 0;
}
时间: 2024-10-12 01:44:29

UVA 11997 【K Smallest Sums】的相关文章

UVA 11997 The K smallest Sums

给出K*K的矩阵,每一行取一个数,构成K个数的和,总共有 k^k种可能,从中取出前k个最小的. 一开始犯了错,因为只要对每行排序,最小的必定是第一列的和,然后我当时就想着,逐步推进,每次将某行的那个数变成其下一列那个数,当然间距要最小.我这样明显是不对的,这样的话每个数只用了一次,而题目的意思明显是可以重复多次. 然后大白上说的是把他看成两行,即每次处理两行,留下最小的k个 再与下一次读入的那一行继续处理.这个方法相当给力,不过有个难点是,怎么在两行的时候,比较快的得到前k小的,我试过全部算一遍

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

来自<训练指南>优先级队列的例题. 题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18702 题意:给定k个整数数组,各包含k个元素.在每个数组中取一个元素加起来,可以得到kk个和,求这些和中最小的k个值(不去重). 数据范围:k [2, 750] 思路:暴力枚举k^k不可取. “先来看问题的简化版:给出两个长度为k的数组A和B,分别在A和B中任取一个数并相加,可以得到k^2个和,求这些和中最小的k个.” 首先

【优先队列之多路合并】UVA - 11997 K Smallest Sums

Source : UVA - 11997 K Smallest Sums http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18702 题意 有k个整数数组,各包含k个元素,从每个数组中选取一个元素加起来,可以得到k^k个和,求这些和中最小的k个值. 示例 Sample Input 3 1 8 5 9 2 5 10 7 6 2 1 1 1 2 Sample Output 9 10 12 2 2 思路 二路归并构建二维平面表:

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

UVA - 11997 K Smallest Sums Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status You're given k arrays, each array has k integers. There are k^k ways to pick exactly one element in each array and calculate the sum o

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

UVa11997 K Smallest Sums  题目: K Smallest Sums You're given k arrays, each array has k integers. There are kk ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest sums among them. In

(DS 《算法竞赛入门经典》)UVA 11997 K Smallest Sums

题目大意:有k个数组,每个数组选取一个数,组成k^k个数.在这k^k个数中选择最小的前k个数 解题思路: 1.如果只有k个数组,那么最后得到的最小的前k个数应该可以由前两个数组得到的最小k个数与第三个数组 按规则运算后得到. 2.如果每个数组只有3个数.那么前两个数组(a:(a0,a1,a2)    b:(b0,b1,b2,a与b数组都已经有序)运算后有的结果矩阵如下: a0+b0,a0+b1,a0+b2 a1+b0,a1+b1,a1+b2 a2+b0,a2+b1,a2+b2 在这个矩阵中,a0

11997 - K Smallest Sums(优先队列)

11997 - K Smallest Sums You’re given k arrays, each array has k integers. There are kk ways to pick exactly one element in eacharray and calculate the sum of the integers. Your task is to find the k smallest sums among them.InputThere will be several

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

Problem K K Smallest Sums You're given k arrays, each array has k integers. There are kk ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest sums among them. Input There will be se

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

vjudge 上题目链接:UVA 11997 题意很简单,就是从 k 个数组(每个数组均包含 k 个正整数)中各取出一个整数相加(所以可以得到 kk 个结果),输出前 k 小的和. 这时训练指南上的一道题,这道题的简化版其实在 15 年的广东省省赛出现过,当时是以送分题的形式出现的,可我还是没能做出来,归根到底还是看书不够,接触的题型不够多. *************************************************************大白书上的讲解开始*******