POJ2442Sequence

摘要:
Id=2442主题含义:输入m组数字,每组包含n个数字。从每组中取一个数后,按非降序输出前n个数的和。思想:它最初打算使用几个for循环,但后来人们认为,如果它如此简单,就不会在堆中进行分类。因此,经过仔细的指导和解释,我理解了一点,并理解了两个优先级队列,只得到了1#include<csdio>2#include>cstring>3#include˂queue>4#include˂vector>5#include<iostream>6usingspacestd;7约束最大值=2005;8intmain()9{10intn;11scanf;12intm,t,s;13inta[maxn];14for15{16priority_queue˂int,vector,less˃Q;//大根堆是用于查找最小值的17priority_6queue˂int、vector,greaterP;//小根堆用于将每一行的编号从最小到最大排序;19for20{21scanf;//输入第一行22P.push;23}24 for 25{26for27scanf first;28while(!P.empty())29{30intb=P.top();31P.pop();32of33{34if35{36//如果大根堆中有t个数字,则判断哪个元素大于b+a[j]。如果它更大,则删除它并添加新的37Q.pop(;38Q.push;39}40elseif41Q。推42}43}4445而(!

http://poj.org/problem?id=2442

题意 :就是输入m个数集,每个含n个数,求从每个集合取一个数后,按非降序输出前n小的和。

思路 : 本来打算是用几个for循环的,后来觉得要是真这么简单就不会在堆里分类了,所以,经过会神详细指导讲解,略懂略懂,弄俩优先队列,正好搞定

POJ2442Sequence第1张POJ2442Sequence第2张
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<vector>
 5 #include<iostream>
 6 using namespace std ;
 7 const int maxn = 2005 ;
 8 int main()
 9 {
10     int n ;
11     scanf("%d",&n);
12     int m,t,s;
13     int a[maxn] ;
14     for(int i = 1 ; i <= n ; i++)
15     {
16         priority_queue<int ,vector<int>,less<int> > Q;//大根堆是用来找和最小的值的
17         priority_queue<int ,vector<int>,greater<int> > P;//小根堆是将输入的每行数从小到大排序
18         scanf("%d %d",&m,&t);
19         for(int h = 0 ; h < t ; h++)
20         {
21             scanf("%d",&s);//先输入第一行
22             P.push(s);
23         }
24         for(int h = 1 ; h < m ; h++)
25         {
26             for(int j = 0 ; j < t ; j++)
27                 scanf("%d",&a[j]) ;
28             while(!P.empty())
29             {
30                 int b = P.top();
31                 P.pop();
32                 for(int j = 0 ; j < t ; j++)
33                 {
34                     if(Q.size() == t && b+a[j] < Q.top())
35                     {
36                         //如果大根堆里已经有了t个数了,那就判断首元素与b+a[j]谁大,若是大,就删掉,加入新的
37                         Q.pop();
38                         Q.push(b+a[j]);
39                     }
40                     else if(Q.size() < t)
41                         Q.push(b+a[j]) ;
42                 }
43             }
44 
45             while(!Q.empty())
46             {
47                 P.push(Q.top());
48                 Q.pop();
49             }
50         }
51         printf("%d",P.top()) ;
52         P.pop();
53         for(int k = 1 ; k < t ; k++)
54         {
55             printf(" %d",P.top()) ;
56             P.pop();
57         }
58         printf("
");
59         //memset(sh,0,sizeof(sh));
60     }
61     return 0 ;
62 }
View Code

免责声明:文章转载自《POJ2442Sequence》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SDUT1061Binomial Showdown(组合数)POJ2151Check the difficulty of problems下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【二叉树】二叉树遍历总结

节点定义如下 1 //Definition for a binary tree node. 2 structTreeNode { 3 intval; 4 TreeNode *left; 5 TreeNode *right; 6 TreeNode(intx) : val(x), left(NULL), right(NULL)...

九大排序算法(C++实现)

Quciksort Mergesort Insertionsort Bubblesort Selectionsort Shellsort Heapsort Countsort Radixsort Summary Quciksort void quick_sort(vector<int> &nums, int l, int r) {...

原型模式——Java实现

问题描述: 向量的原型 用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。 浅克隆类图: 浅克隆Java代码: 1 //Vector.java 2 packageqiankelong; 3 4 importjava.util.Arrays; 5 6 public cla...

STL笔记(に)--vector容器

Vector 1.可变长的动态数组 2.需包含头文件#include<vector> (当然,如果用了万能头文件#include<bits/stdc++.h>则可忽略) 3.支持随机访问迭代器: 根据下标随机访问某个元素,时间复杂度O(1) 在尾部添加速度很快 在中间插入慢 4.所有STL算法都能对vector操作。 下面是关于v...

leetcode—Palindrome 解题报告

1.题目描述 Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s =...

杨辉三角(数组)

//杨辉三角(数组) /* * @Description: Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. * Input: 5 * Output: * [ * [1], * [1,1], * [...