USACO_humble

1 /*
2 ID: Kenfy21
3 PROG: humble
4 LANG: C++
5 */
6 /*
7 题意: 给出一个素数的集合{p1, p2, p3}, humble numble 的定义是p1, p1*p2, p1*p3, p1*p1,p1*p2*p3......
8 输入:k(素数个数), n
9 然后输入k个素数, 让你求出第n个humble numble的值(按从小到大顺序)
10
11 解题思路: 这是一道比较经典的动态规划题目. 如果我们求出第i个humble numble, 则第i+1个humble numble的值为各个素数与前边i个所求
12
13 出的humble number的乘积比第i个humble numble 大的所有取值中最小的一个. 如果不加任何优化,则时间复杂度为k*(n^2).
14 一个优化的方法是,用一个数组记忆每个素数与所求出的humble number取乘积的位置.
15 */
16 #include <iostream>
17 #include <fstream>
18 #include <algorithm>
19
20 using namespace std;
21
22 const int MAXK = 100+1;
23 const int MAXN = 100000+1;
24 const int INF = 0x7fffffff;
25 struct T_Humble
26 {
27 int prime;
28 int Xpos;
29 };
30
31 int K, N;
32 T_Humble Humble[MAXK];
33 int main()
34 {
35 ifstream fin( "humble.in" );
36 ofstream fout( "humble.out" );
37
38 int humble[MAXN];
39 humble[0] = 1;
40 fin >> K >> N;
41
42 for(int i = 0; i < K; ++i)
43 {
44 fin >> Humble[i].prime;
45 Humble[i].Xpos = 0;
46 }
47
48 int minPos, minVal;
49 for(int i = 1; i <= N; ++i)
50 {
51 minPos = 0;
52 minVal = INF;
53 for(int j = 0; j < K; ++j)
54 {
55 if( Humble[j].prime*humble[Humble[j].Xpos] < minVal )
56 {
57 minPos = j;
58 minVal = Humble[j].prime*humble[Humble[j].Xpos];
59 }
60 }
61 if( minVal == humble[i-1] )
62 {
63 i--;
64 Humble[minPos].Xpos++;
65 }
66 else
67 {
68 humble[i] = minVal;
69 Humble[minPos].Xpos++;
70 }
71 }
72
73 fout << humble[N] << endl;
74 fin.close();
75 fout.close();
76 return 0;
77 }
78
posted on 2011-02-18 13:08  Kenfly  阅读(289)  评论(0编辑  收藏  举报