这道题和前面3道题的解题思路是完全一样的。两个指针从0开始起头并进,一个表示 x2+1,另一个表示x3+1,哪个小前进(指针+1)哪个,如果两个相等就都前进。这样就可以产生出来递增的不重复的序列。
thestoryofsnow | 2591 | Accepted | 39336K | 235MS | C++ | 811B |
/*
ID: thestor1
LANG: C++
TASK: poj2591
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cassert>
using namespace std;
const int MAXN = 10000000;
int main()
{
std::vector<int> nums(MAXN, 1);
nums[0] = 1;
std::vector<int> ptr(2, 0);
for (int i = 1; i < MAXN; ++i)
{
nums[i] = min(nums[ptr[0]] * 2 + 1, nums[ptr[1]] * 3 + 1);
if (nums[i] == nums[ptr[0]] * 2 + 1)
{
ptr[0]++;
}
if (nums[i] == nums[ptr[1]] * 3 + 1)
{
ptr[1]++;
}
}
int n;
while (scanf("%d", &n) > 0)
{
printf("%d\n", nums[n - 1]);
}
return 0;
}