poj 2591(递推)

问题描述:

已知:集合S满足如下条件:

  • 1属于S
  • 若x属于S,则2x+1和3x+1也属于S
  • 除了上述两条外,S中再无其他元素
  • S中的元素按升序排列
求:S中指定的第N个元素

输入:若干case,每个case占用1行,只含一个整数表示N
输出:S中第N个元素的值

Sample Input:
100
254

Sample Output:
418
1461

思路:
首先,这是一道典型的递推题,类似的问题还有poj 1338、poj 2545和poj 2247
我们的基本思路是:设置三个游标p、q和i,p和q初始值均为0,i初始值为1,a[0] = 1。其中p用于生成2*a[p]+1,q用于生成3*a[q]+1,i用于指向数组a新生成的元素。然后有如下规则:
  • 若2*a[p]+1 < 3*a[q]+1,则a[i] = 2*a[p]+1,且i++,p++
  • 若2*a[p]+1 > 3*a[q]+1,则a[i] = 3*a[q]+1,且i++,q++
  • 若2*a[p]+1 == 3*a[q]+1,则a[i] = 2*a[p]+1,且i++,p++,q++

代码:
#include <stdio.h>
#define SIZE 10000010
#define MIN(a, b) (a < b ? a : b)
long a[SIZE];
int main(){
	long i2, i3;
	i2 = i3 = 1;
	a[1] = 1;
	for(long i = 2; i < SIZE; i++){
		a[i] = MIN(2*a[i2]+1, 3*a[i3]+1);
		if(a[i] == 2*a[i2]+1) i2++;
		if(a[i] == 3*a[i3]+1) i3++;
	}
	long t;
	while(EOF != scanf("%ld", &t))
		printf("%ld\n", a[t]);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值