坑爹啊!!!一直以为O(nk)会超时,所以想了很久只想到了O(nlogn),就是用堆,可是会超内存!!!想了很久了,不得已去网上看题解居然没看懂………………一直到今天认真地看了题解才知道是最朴素的算法!!!足足花了我五天时间啊!真伤心,不过收获还是有的,就是会用二叉堆了,还有也会用单调队列了(学优先队列的副产品),算是安慰吧。贴出代码,以作纪念!!

View Code
 1  /*{
 2 ID:jzy3209981
 3 PROG:humble
 4 LANG:C++
 5 }*/
 6 #include<stdio.h>
 7 #include<iostream>
 8 #include<string.h>
 9 #include<math.h>
10 using namespace std;
11 
12 long long num[100001];
13 int prime[105];
14 int state[105];
15 int again[100];
16 int m;
17 int n;
18 void getnum(int np)
19 {
20     int i,p=1;
21     unsigned int minn=(1<<31);
22     for(i=0;i<n;i++)
23     {
24         if(prime[i]*num[state[i]]<=num[np-1])
25             state[i]++;
26         if(prime[i]*num[state[i]]<=minn&&prime[i]*num[state[i]]>num[np-1]&&state[i]<np)
27         {
28             if(prime[i]*num[state[i]]==minn)
29                 again[p++]=i;
30             else
31             {
32                 minn=prime[i]*num[state[i]];
33                 again[0]=i;
34             }                
35         }
36     }
37     for(i=0;i<p;i++)
38         state[again[i]]++;
39     num[np]=minn;
40 }
41 int main()
42 {
43     freopen ("humble.in","r",stdin);
44     freopen ("humble.out","w",stdout);    
45     int i,np=2;
46     scanf("%d%d",&n,&m);
47     for(i=0;i<n;i++)
48         scanf("%d",&prime[i]);
49     num[0]=1;
50     num[1]=prime[0];
51     state[0]=1;
52     while(np<=m)
53     {
54         getnum(np);
55         np++;
56     }    
57     printf("%lld\n",num[m]);
58     return 0;
59 }

 

posted on 2012-08-12 22:01  醉春雨  阅读(275)  评论(0)    收藏  举报