首页 > 代码库 > 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 }
Luogu2723丑数Humble Numbers
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。