poj2442(Sequence)

题目地址:Sequence

题目大意;

给你m行,每行有n个数。 分别从每一行取一位数,然后加和。这样的数一定会构成m^n个。输出最小的n个即可。

解题思路:

思路: 因为,要每行都取一个,构成一个和sum。需要找出n个sum。  我们需要一行一行的找,不妨先设前两行的最小的n个sum是由第一行n个数和第二行的第一个数构成的。 存入c[]数组里,然后一次遍历第二行其他的数,看是否有小于c[]数组里最大的数,然后替换,这是前两行的最小的n个sum已经找到,存到了c[]数组, 然后找前三行,同样设让第三行的第一个数与数组c[]所有的数加和, 然后遍历第三行其他的数,看是否有小于c[]数组里最大的数。替换。以此类推。找到第m-1行  结束寻找,这时数组c[]里就是题目要求的数组。

实现:因为做的是堆和优先队列,所以优先想到用优先队列实现最大堆,这样Q.top()始终存的是n个sum中最大的那个数,而且判断,替换后,优先队列自动从大到小排列。(ps:不知道不用优先队列,每次排序会不会超时。)注意:(剪枝时注意序列的排列,代码中有说明)。

代码1:正常做法 T:4000+

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <string>
 8 #include <bitset>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 #include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 /***************************************/
21 const int INF = 0x7f7f7f7f;
22 const double eps = 1e-8;
23 const double PIE=acos(-1.0);
24 const int d1x[]= {0,-1,0,1};
25 const int d1y[]= {-1,0,1,0};
26 const int d2x[]= {0,-1,0,1};
27 const int d2y[]= {1,0,-1,0};
28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
30 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/
31 /***************************************/
32 void openfile()
33 {
34     freopen("data.in","rb",stdin);
35     freopen("data.out","wb",stdout);
36 }
37 priority_queue<int> qi1;
38 priority_queue<int, vector<int>, greater<int> >qi2;
39 /**********************华丽丽的分割线,以上为模板部分*****************/
40 const int M=2005;
41 int s[M],sum[M];
42 int main()
43 {
44     int cas;
45     scanf("%d",&cas);
46     priority_queue<int >Q;
47     while(cas--)
48     {
49         int m,n;
50         scanf("%d%d",&m,&n);
51         int i,j,k;
52         while(!Q.empty())
53             Q.pop();
54         for(i=0; i<n; i++)
55             scanf("%d",&s[i]);
56         for(i=1; i<m; i++)
57         {
58             for(j=0; j<n; j++)
59             {
60                 scanf("%d",&sum[j]);
61             }
62             for(j=0; j<n; j++)
63                 Q.push(sum[0]+s[j]);
64             int max;
65             for(j=1; j<n; j++)
66                 for(k=0; k<n; k++)
67                 {
68                     max=sum[j]+s[k];
69                     if (max<Q.top())
70                     {
71                         Q.pop();
72                         Q.push(max);
73                     }
74                 }
75             int d=0;
76             while(!Q.empty())
77             {
78                 s[d++]=Q.top();
79                 Q.pop();
80             }
81         }
82         sort(s,s+n);
83         printf("%d",s[0]);
84         for(i=1; i<n; i++)
85             printf(" %d",s[i]);
86         printf("\n");
87     }
88     return 0;
89 }

代码2:剪枝  T:800+(估计是数据的原因)

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <string>
 8 #include <bitset>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 #include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 /***************************************/
21 const int INF = 0x7f7f7f7f;
22 const double eps = 1e-8;
23 const double PIE=acos(-1.0);
24 const int d1x[]= {0,-1,0,1};
25 const int d1y[]= {-1,0,1,0};
26 const int d2x[]= {0,-1,0,1};
27 const int d2y[]= {1,0,-1,0};
28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
30 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/
31 /***************************************/
32 void openfile()
33 {
34     freopen("data.in","rb",stdin);
35     freopen("data.out","wb",stdout);
36 }
37 priority_queue<int> qi1;
38 priority_queue<int, vector<int>, greater<int> >qi2;
39 /**********************华丽丽的分割线,以上为模板部分*****************/
40 const int M=2005;
41 int s[M],sum[M];
42 int main()
43 {
44     int cas;
45     scanf("%d",&cas);
46     priority_queue<int >Q;
47     while(cas--)
48     {
49         int m,n;
50         scanf("%d%d",&m,&n);
51         int i,j,k;
52         for(i=0; i<n; i++)
53             scanf("%d",&s[i]);
54         for(i=1; i<m; i++)
55         {
56             sort(s,s+n); //需要排序
57             for(j=0; j<n; j++)
58             {
59                 scanf("%d",&sum[j]);
60             }
61             for(j=0; j<n; j++)
62                 Q.push(sum[0]+s[j]);
63             int max;
64             for(j=1; j<n; j++)
65                 for(k=0; k<n; k++)
66                 {
67                     max=sum[j]+s[k];
68                     if (max>=Q.top())  //因为这个地方需要使后面的数都保证大于Q.POP(),所以需要对s数组排序。
69                         break;
70                     if (max<Q.top())
71                     {
72                         Q.pop();
73                         Q.push(max);
74                     }
75                 }
76             int d=0;
77             while(!Q.empty())
78             {
79                 s[d++]=Q.top();
80                 Q.pop();
81             }
82         }
83         sort(s,s+n);
84         printf("%d",s[0]);
85         for(i=1; i<n; i++)
86             printf(" %d",s[i]);
87         printf("\n");
88         while(!Q.empty())
89             Q.pop();
90     }
91     return 0;
92 }

时间: 2024-08-24 17:46:15

poj2442(Sequence)的相关文章

oracle的序列号(sequence)

Oracle的自增列,要采用序列号(sequence). 初始化阶段要手动建立一个sequence,然后插入的时候,还要手动自己去读这个sequence的nextval赋给相关字段,如ID,麻烦的很.好处就是记录插入前,我们就知道这个ID值了,在处理主从表时,有时还比较方便.但这个对sql server来说,也不是问题,可以获得的. oracle这个序列号,还有个高速缓存这么个东东,默认是一次性生成20个,没用完可能就丢了,可能造成ID不连贯.更有甚者,有时可能会引起误解. 好比说,我有个存储过

Oracle修改序列(Sequence)起始值的方法

Oracle修改序列(Sequence)起始值的方法 Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多. 但是,有时需要修改序列初始值(START WITH)时,有同仁使用这个语句来修改:alter sequence sequencename start with xxxxxxxx.但是,在Oracle DB中,修改序列没有这样的语法.下面介绍几种修改方式: 1.先删除序列,然后重新创建.不过这不是当前要讲的重点.这个方法比较暴

MySQL实现序列(Sequence)效果以及在Mybatis中如何使用这种策略

前言: 在oracle中一般使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的,但也只是自增,而不能设置步长.开始索引.是否循环等.最重要的是一张表只能设置一个字段使用自增,但有的时候我们需要两个或两个以上的字段实现自增(单表多字段自增),MySQL本身是实现不了的,但我们可以用创建一个序列表,使用函数来获取序列的值 一 MySQL中序列的实现 (1)新建一个测试表: DROP TABLE IF EXISTS

SQL Server 序列(SEQUENCE)使用

众所周知,在之前的SQL SERVER版本中,一般采用GUID或者IDENTITY来作为标示符,但是IDENTITY是一个表对象,只能保证在一张表里面的序列,当我们遇到以下情况时, 如上表,我们需要在多表之间,实现ID的一致性,在SQL SERVER里面就会有一定的麻烦,通常我们会使用额外使用一张TEMP表来映射这些ID的关系然后再从中取序列来完成. SEQUENCE在ORACLE中其实很早就存在了,SQL SERVER 2012的SEQUENCE功能和那个相似,是一个基于SCHEMA的对象,所

MySQL实现序列(Sequence)效果

MySQL实现序列效果 一般使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的,但也只是自增,而不能设置步长.开始索引.是否循环等,最重要的是一张表只能由一个字段使用自增,但有的时候我们需要两个或两个以上的字段实现自增(单表多字段自增),MySQL本身是实现不了的,但我们可以用创建一个序列表,使用函数来获取序列的值. 1. 新建序列表 drop table if exists sequence;   crea

SQL Server 2012 开发新功能 序列对象(Sequence)(转)

转载链接:http://www.cnblogs.com/zhangyoushugz/archive/2012/11/09/2762720.html 众所周知,在之前的sqlserver版本中,一般采用GUID或者identity来作为标示符,但是identity是一个表对象,只能保证在一张表里面的序列,当我们遇到以下情况时, 表1 ID 订单类型 价格 1 火车票 200 4 飞机票 2000 5 船票 600 表2 ID 订单类型 价格 2 酒店 400 3 公园门票 170 6 租车费用 3

RxJS入门(3)----深入Sequence

在之前的系列中,我吧sequence翻译成了序列,题目我就不翻译了,感觉翻译过来的有点失去了点啥.其他好多地方都是用stream(流)来比喻和形容. 可视化Observable 在Rxjs编程中你已经学了一些关于使用最频繁的操作符了.讨论什么是sequence的操作符感觉有点抽象.为了帮助开发者更容易的理解操作符,我们使用marble diagrams(弹子图?翻译估计有问题)来标准可视化.他们很形象的代表了异步的数据流,并且你可以在其他的rxjs资料里面找到. 让我们看下range操作符,它返

ansible 学习笔记(上)

运维工具 当前常见的运维工具(Configuration)有以下一种puppret(ruby)saltstack(python)chefcfengine.... Command and Control; fabricfunc 程序发布: 手动发布 脚本发布 发布程序(运维程序) 程序发布要求:1.不能影响用户体验:2.系统不能停机:3.不能导致系统故障或造成系统完全不可用: 灰度发布模型(考虑以下两种维度):1.主机:2.用户: 发布思路: /webapps/tuangou /webapps/t

python之最强王者(7)——元组(tuple)

1.序列(sequence): 说明:在前面的字符串列表中其实我们已经用到了序列,之所以放到这篇来讲主要是为了承上启下,方便理解和记忆. python的数据访问模型:直接存取 ,序列 ,映射 对非容器类都可以直接存取,所有的数值类型归为此类. 序列类型是指容器内的元素从0开始的索引顺序访问,一次可以访问一个或者多个元素. 字符串.列表.元组归到次类 映射类型和序列类型不同之处,它使用的索引和顺序的数字偏移量不同,它的元素无序存放,通过唯一的key来访问. 字典就是这种类型. 2.Python 元