POJ 2442 题目大意:
给出m个序列,每个序列有n个非负整数,每次从每一个序列中取出一个数(共m个数)求和(显然有 n^m 个和),求这些和数中前n个最小的数。
样例:(第一行是测试次数1,第二行是m和n,接下来是m个序列)
Sample Input
1
2 3
1 2 3
2 2 3
Sample Output
3 3 4
解题步骤:
1.将第一序列读入array1数组中,并按升序排序。
2.将第二序列数据读入array2数组中,并按升序排序。
将array2[0] + array1[i] ( 0<=i<=n-1)读入heap优先队列中建堆。
然后array2[1] + array1[i] (0<=i<=n-1),如果array2[1] + array1[i]比堆heap的顶点大,则退出,否则删除堆的顶点,插入array2[1] + array1[i]。然后是array2[2],...array2[n - 1]
3.将heap的数据拷贝到array1中,并对array1按升序排序
4.循环2,3步,直到所有数据读入完毕。
5.打印array1中的数据即为结果。
import java.util.Scanner;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Comparator;
public class Main{
private int[] array1;
private int[] array2;
PriorityQueue<Integer> heap;
public Main(){
}
private void go(){
Scanner in=new Scanner(System.in);
int t=in.nextInt();
while(t-->0){
int m=in.nextInt();
int n=in.nextInt();
array1=new int[n];
array2=new int[n];
//优先队列作堆使用,从大到小
heap=new PriorityQueue<Integer>(n,new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
if(o1<o2)
return 1 ;
else if(o1>o2){
return -1;
}else{
return 0;
}
}
});
for(int i=0;i<n;i++)
array1[i]=in.nextInt(); //读入第一序列
Arrays.sort(array1); //排序,升序
for(int i=1;i<m;i++){ //处理第二到第m个序列
for(int j=0;j<n;j++){
array2[j]=in.nextInt(); //先读入第二序列,然后第三。。。
heap.offer(array1[0]+array2[j]);//建堆
}
Arrays.sort(array2); //升序排列
for(int k=1;k<n;k++)
for(int l=0;l<n;l++){
if(array1[k]+array2[l]>heap.peek()) //查看堆顶元素
break;
heap.poll(); //删除堆的顶点
heap.offer(array1[k]+array2[l]);
}
for(int k=n-1;k>=0;k--)
{
array1[k]=heap.poll(); //将heap的数据拷贝到array1中
}
}
System.out.printf("%d",array1[0]);
for(int i=1;i<n;i++)
System.out.printf(" %d",array1[i]);
System.out.println();
}
}
public static void main(String[] args){
Main ma=new Main();
ma.go();
}
}
分享到:
相关推荐
这个过程可以使用优先队列(如二叉堆)来优化,以快速找到当前最小权重的边。 以下是Prim算法的详细步骤: 1. 选择一个起点,比如图中的任意一个顶点,将其加入到最小生成树中。 2. 创建一个数据结构(如数组或优先...
2. **数据结构**:链表、栈、队列、树(二叉树、平衡二叉树、红黑树等)、图、哈希表、堆、优先队列等。 3. **数学知识**:组合数学、数论(模运算、同余方程、最大公约数与最小公倍数、质因数分解等)、概率统计、...
大顶堆是一种特殊的完全二叉树,其每个节点的值都大于或等于其子节点的值,常用于实现优先队列,快速找到最大元素,或者进行高效的排序算法,如堆排序。 在编程竞赛中,大顶堆经常被用来解决时间复杂度要求较高的...
在计算机科学中,大顶堆和小顶堆是两种特殊的二叉堆,它们分别保证了根节点是其子树中最大或最小的元素,常用于实现优先队列。 大顶堆通常用于快速找到当前最大元素,例如在求解最大值问题或执行堆排序时。小顶堆则...
1. **算法基础**:报告可能会首先介绍一些基本的算法知识,如排序(快速排序、归并排序、堆排序等)、搜索(深度优先搜索、广度优先搜索)、图论(最短路径算法Dijkstra、Floyd-Warshall、Prim或Kruskal最小生成树...
POJ1039-Pipe可能需要应用到的算法包括但不限于深度优先搜索(DFS)、广度优先搜索(BFS)、动态规划、贪心算法或图的遍历算法。 4. **图论**:由于题目名为"Pipe",很可能涉及到图的结构,比如管道之间的连接可以...
一种可能的方法是使用优先队列(堆),例如二叉堆,这样可以在O(log n)的时间内找到最小的两个元素并合并。此外,还可以考虑使用平衡二叉搜索树(如AVL树或红黑树),它们在插入和删除操作上都保持较高的效率。 ...
标题中的“POJ 1078 算法”指的是北京大学在线判题系统(Problem Online Judge,简称POJ)中的第1077题,这通常是一个编程竞赛或者算法练习题目。POJ是一个供程序员练习算法、提交代码并获取运行结果的平台,主要...
### POJ 3009 Curling 2.0 解题报告 #### 问题描述与分析 本题属于经典的搜索类题目,要求我们利用给定的规则在一个类似于网格的地图上移动一个石头,从起点到达终点,并求出最少的步数。地图上除了起点和终点外,...
2. **数据结构**:链表、数组、栈、队列、树(二叉树、平衡树、堆)、图等。 3. **字符串处理**:KMP算法、Rabin-Karp算法、Manacher's Algorithm等。 4. **数学应用**:模运算、数论、组合数学、图论等。 5. **...
可以使用优先队列(如堆)来高效地实现这个过程。 4. **频道分配**:为每个基站分配频道,确保相邻的基站不会分配到相同的频道。这通常通过回溯或动态规划来实现,但在这个问题中,由于采用了贪心策略,所以这个...
在数组中找出第K大的元素,可以采用多种方法实现,如快速选择、堆排序或优先队列。这里我们可以利用已排序的数组,通过一次遍历找到第K个元素。也可以采用迭代或者递归的方式,逐步缩小查找范围。 在解决POJ2092...
- 为了优化效率,可以避免不必要的角度计算,例如使用优先队列存储待比较的点。 - 保持点集的有序性可以简化部分逻辑,比如按照y坐标排序,便于快速找到下一个角度最大点。 通过阅读11129178_AC_4141MS_5600K.java...
在Java代码中,我们创建了一个`Queue<Integer>`来存储节点,用`int[] map`作为标记数组,`while`循环不断从队列中弹出节点进行处理,直到找到牛的位置。对于每个节点,我们检查它是否等于牛的位置,如果是则结束搜索...
6. **数据结构**:如链表、栈、队列、堆、树、图等,它们是算法的基础,不同的数据结构适合解决不同类型的问题。 7. **字符串处理**:如KMP算法、Rabin-Karp算法等,用于字符串匹配和处理。 8. **数学知识**:包括...
6. **堆**:用于优先队列和部分排序问题。 7. **Trie树**:用于字符串查找和前缀匹配,分为静态建树和动态建树,如POJ2513。 ### 简单搜索 1. **深度优先搜索(DFS)**:遍历图或树的深度,如POJ2488、3083、3009、...
在ACM竞赛中,参赛者通常会使用C、C++、Java或Python等语言编写代码来解决各种复杂的问题,如图论、动态规划、贪心算法、排序和搜索等。"AC"是"Paid Off"或"Accepted"的缩写,意味着这些代码已经通过了所有测试用例...
这意味着我们可以从这个压缩包中学习到如何解决这个问题的正确方法,包括可能使用的编程语言(如C++、Java或Python)、算法思路以及代码实现细节。 【标签】"poj" 暗示了这道题目是编程竞赛的一部分,POJ是一个面向...
4. **数据结构**:如链表、栈、队列、树(二叉树、平衡树、堆)、图等,它们是解决问题的基础工具。 5. **字符串处理**:KMP算法、Z算法、Manacher算法等,用于高效地处理字符串匹配问题。 6. **数学应用**:组合...