【培训试题】集合问题(easy) |
Time Limit:1000MS Memory Limit:65536K
Total Submit:1035 Accepted:324
Description
集合的前N个元素:编一个程序,按递增次序生成集合M的最小的N个数,M的定义如下:
(1)数1属于M;
(2)如果X属于M,则Y=2*X+1和Z=3*x+1也属于M;
(3)此外再没有别的数属于M。
Input
n(b.in) (1≤n≤100)
Output
生成集合M的最小的N个数(b.out)
Sample Input
4
Sample Output
1 3 4 7
【解析】
队列结构的基础习题,一开始想复杂了。
大致思路是用两个队列分别存放每次计算出来的y和z的值。每次更新时,比较两个队列头结点的值,选择更新较小的一个,把对应的y和z值储存。一边更新一边输出即可。
程序如下:var y,z:array[1..1000] of longint; n,hdi,hdj,t,count:longint; function min(a,b:longint):longint; begin if a<b then exit(a); exit(b); end; begin readln(n); t:=1; y[1]:=1; z[1]:=1; hdi:=1; hdj:=1; count:=1; while count<=n do begin if count=n then begin writeln(min(y[hdi],z[hdj])); halt; end else write(min(y[hdi],z[hdj]),' '); if y[hdi]<z[hdj] then begin inc(t); y[t]:=2*y[hdi]+1; z[t]:=3*y[hdi]+1; inc(hdi); end else begin inc(t); y[t]:=2*z[hdj]+1; z[t]:=3*z[hdj]+1; if y[hdi]=z[hdj] then begin inc(hdi); inc(hdj); end else inc(hdj); end; inc(count); end; end.