集合定义 C/C++

问题描述
集合S的定义如下: 
(1) 1在S内; 
(2) 如果x在集合S内,则2x+1与3x+1也在S内; 
(3) 只有满足条件(1)(2)的元素在S内. 

把S中的元素按递增顺序排列,请输出S中的第N个元素。
输入
本题有多组测试数据。每组测试数据一行,每行一个正整数N (1 <= N <= 100000)。
输出
对每组测试数据,在单独的一行中输出S的第N个元素。
输入样列
1
2
3
4
5
6
100
254
输出样例
1
3
4
7
9
10
418
1461
思路阐述:这道题数据比较大有十万,如果用循环做,肯定超时TLE没得商量。所以肯定得有点技巧了,比如用布尔数组标记,如果某个数满足规则在集合中标记为true,否则标记为false。
这样集合元素的生成和排序就都解决了。
注意:这里有个小小的坑,如果循环定义为N=3000000;直接用来循环肯定会RE的,原因是下标越界,这个由于我也中过枪我就不说具体原因了,嘿嘿O(∩_∩)O~
好了,废话不多说,说好的代码来了!
 1 #include<stdio.h>
 2 #define N 3000001
 3 bool k[3*N]={0};
 4 int aim[N]={0};
 5 void f()
 6 {
 7     k[1]=true;
 8     int i,j;
 9     for(i=1;i<N;i++)
10         if(k[i])
11     {
12         k[2*i+1]=true;
13         k[3*i+1]=true;
14     }
15     j=0;
16     for(i=0;i<N;i++)
17     {
18         if(k[i])
19             aim[j++]=i;
20     }
21 
22 }
23 int main()
24 {
25     int n;
26     f();
27     while(~scanf("%d",&n))
28     {
29         printf("%d\n",aim[n-1]);
30     }
31     return 0;
32 }
//如有问题,欢迎留言O(∩_∩)O~

 


posted @ 2015-03-11 13:30  诀别诗  Views(1185)  Comments(0Edit  收藏  举报