您的位置:首页 > 其它

USACO 3.1 Humble Numbers丑数

2016-12-15 21:06 253 查看
USACO 3.1 Humble Numbers丑数Time Limit:12000MS  Memory Limit:65536KTotal Submit:151 Accepted:36Case Time Limit:1000MSDescription  对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合。这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S的丑数集合。  注意:我们不认为1 是一个丑数。  你的工作是对于输入的集合S去寻找集合中的第N个丑数。longint(signed 32-bit)对于程序是足够的。Input 第 1 行: 二个被空格分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.第 2 行: K 个被空格分开的整数:集合S的元素Output单独的一行,写上对于输入的S的第N个丑数。Sample Input
4 19
2 3 5 7
Sample Output
27
把1放入优先队列,中每次从优先队列中取出一个元素,k,把2k, 3k, 5k, 7k放入优先队列中从2开始,取出的第n个元素就是第n大丑数
constmaxn=300000;vara,s:array[0..maxn] of longint;n,k,i,j,l:longint;procedure up(i:longint);vardone:boolean;beginif i=1 then exit;repeatdone:=false;if a[i]<a[i div 2] thenbegina[0]:=a[i];a[i]:=a[i div 2];a[i div 2]:=a[0];endelse done:=true;i:=i div 2;until(i=1) or done;end;procedure inst(x:longint);begininc(l);a[l]:=x;up(l);end;procedure down(i:longint);vardone:boolean;begindone:=false;if 2*i>l then exit;repeati:=2*i;if (i+1<=l) and (a[i+1]<a[i]) then inc(i);if a[i div 2]>a[i] thenbegina[0]:=a[i];a[i]:=a[i div 2];a[i div 2]:=a[0];endelse done:=true;until (2*i>l) or done;end;procedure delt(i:longint);varx,y:longint;beginx:=a[i];y:=a[l];dec(l);if i=l+1 then exit;a[i]:=y;if y<x then up(i)else down(i);end;procedure main;vari,j:longint;t:int64;beginl:=1;for i:=1 to n+1 dobegint:=a[1];for j:=1 to k doif t*s[j]<maxlongintthen inst(t*s[j]);delt(1);while t=a[1] do delt(1);end;writeln(t);end;beginreadln(k,n);a[1]:=1;for i:=1 to k doread(s[i]);main;end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: