Humble Numbers USCAO chapter 3.1

 ...目测我自己写坑定超时,就去NOCOW看了下,题解,官方是每个质数与已有的humble想乘取大于最大humble的最小数即是新的最大humble,

然后我就写了个个,开始嫌麻烦用set存,超时的飞起。然后全部改成数组,结果case 6还是超时,想了半天感觉和别人的题解也没啥差别,为什么运行时间差这么多

后来试着把69行的循环初始条件改成i=0,改成i=1,瞬间过了....后来一想确实i=0 没用啊,而且case 6求第100000个,白白循环100000次....

 

 

 

 1 /*
 2 
 3 ID: hubiao cave
 4 
 5 PROG: humble
 6 
 7 LANG: C++
 8 
 9 */
10 
11 
12 
13 
14 #include<iostream>
15 
16 #include<fstream>
17 #include<algorithm>
18 #include<set>
19 #include<cstring>
20 
21 using namespace std;
22 
23 
24 
25 
26 int main()
27 
28 {
29 
30     ifstream fin("humble.in");
31     ofstream fout("humble.out");
32     int prim[102];
33     int humble[100002];
34     
35     int more[102];
36 
37     memset(humble,0,100002*4);
38     memset(prim,0,102*4);
39 
40 
41     int lastInd[102];
42     for(int i=0;i<102;i++)
43         lastInd[i]=0;
44     
45     int cnt,number,temp;
46     int hlen=0;
47     fin>>cnt>>number;
48     for(int i=0;i<cnt;++i)
49     {
50         fin>>temp;
51         prim[i]=temp;
52     }
53     prim[cnt]=1;
54     sort(prim,prim+cnt+1);
55     humble[0]=1;
56     hlen++;
57 
58 
59 
60     while(hlen<=number)
61     {
62 
63         int lasthumber=humble[hlen-1];
64         int cnt1=0;    
65         int* pmin=0;
66         int mcnt=0;
67 
68 
69         for(int i=1;i<=cnt;i++)
70         {
71 
72             for(int j=lastInd[cnt1];j<hlen;j++)
73             {
74                 if(prim[i]*humble[j]>lasthumber)
75                 {
76                     more[mcnt++]=prim[i]*humble[j];
77                     lastInd[cnt1]=j;
78                     break;
79                 }
80                 
81             }
82                 cnt1++;
83         }
84 
85         pmin=min_element(more,more+mcnt);
86         humble[hlen++]=*pmin;    
87 
88     }
89 
90     fout<<humble[hlen-1]<<endl;
91 
92     return 0;
93 
94 
95 }

 

posted @ 2013-09-24 23:15  cavehubiao  阅读(230)  评论(0编辑  收藏  举报