首页 > 代码库 > Luogu2723丑数Humble Numbers

Luogu2723丑数Humble Numbers

Luogu2723丑数Humble Numbers

这是一道经典的归并排序题,100路归并,思路很简单,寻找最小值加入答案队列,然后把所有最小值的指针都前移(可能有重复的),直到答案队列的长度达到n,输出即可。

话说好像还有用堆的,我打了一个,结果最后一个点T了,估计是哈希函数没选好,开O3都没有(代码附下)。

 1 ///一百路归并
 2 #include<cstdio>
 3 #include<iostream>
 4 using namespace std;
 5 long long d[105],q[100001];
 6 int p[105];
 7 int main()
 8 {
 9     int n,k,size=0;
10     long long x; 
11     scanf("%d%d",&k,&n);
12     for(int i=1;i<=k;i++)
13         scanf("%lld",&d[i]);
14     q[0]=1;
15     while(size<n)
16     {
17         x=1e18;
18         for(int i=1;i<=k;i++) x=min(x,q[p[i]]*d[i]);
19         q[++size]=x;
20         for(int i=1;i<=k;i++) if(x==q[p[i]]*d[i]) p[i]++;
21     }
22     printf("%lld",q[size]);
23     return 0;
24 }
技术分享
 1 #pragma GCC optimize(3) 
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<cstring>
 5 using namespace std;
 6 const int mod=2000007;
 7 typedef long long LL;
 8 int size,s;
 9 LL d[101],ugly[3000001];
10 LL hashi[mod];
11 inline void hash_del(LL x)
12 {
13     int y=x%mod;
14     while(hashi[y]!=x) y=(y+1)%mod;
15     hashi[y]=0;
16 }
17 inline bool hash_push(LL x)
18 {
19     int y=x%mod;
20     while(hashi[y]!=0&&hashi[y]!=x) y=(y+1)%mod;
21     if(hashi[y]==0)
22     {
23         hashi[y]=x;
24         return 1;
25     }
26     else return 0;
27 }
28 inline void heap_push(LL x){
29     size++;
30     ugly[size]=x;
31     int l=size;
32     while(ugly[l]<ugly[l/2]&&l>1){
33         swap(ugly[l],ugly[l/2]);
34         l=l/2;
35     }
36 }
37 inline void heap_down(){
38     int l;
39     l=1;
40     while((ugly[l]>ugly[l*2]&&l*2<=size)||(ugly[l]>ugly[l*2+1]&&l*2+1<=size)){
41         if(ugly[l*2+1]<ugly[l*2]&&l*2+1<=size){
42             swap(ugly[l],ugly[l*2+1]);
43             l=l*2+1;
44         } else {
45             swap(ugly[l],ugly[l*2]);
46             l=l*2;
47         }
48     }
49 }
50 int main(){
51     int n,k;
52     scanf("%d%d",&n,&k);
53     size=0;
54     s=0;
55     for(int i=1;i<=n;i++){
56         scanf("%lld",&d[i]);
57         heap_push(d[i]);
58         hash_push(d[i]);
59     }
60     LL a,w;
61     for(int j=1;j<=k;j++){
62         a=ugly[1];
63         hash_del(a);
64         ugly[1]=ugly[size];
65         size--;
66         heap_down();
67         for(int i=1;i<=n;i++) if(hash_push(a*d[i])) heap_push(a*d[i]);
68         if(size>k) size=k;
69     }
70     printf("%lld",a);
71     return 0;
72 }
View Code

 

Luogu2723丑数Humble Numbers