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

你可能感兴趣的:(USACO)