坑爹啊!!!一直以为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 }

浙公网安备 33010602011771号