集合问题

这是一个关于集合M生成的编程问题,集合中的元素遵循特定规则。解决方案利用队列数据结构,通过两个队列分别存储Y和Z的值,依次比较并更新,输出集合的最小N个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【培训试题】集合问题(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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值