zoukankan      html  css  js  c++  java
  • 集合定义 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
    ",aim[n-1]);
    30     }
    31     return 0;
    32 }
    //如有问题,欢迎留言O(∩_∩)O~

  • 相关阅读:
    递推2 2046
    递推思想
    acm2047
    杭电ACM2043
    判断a=b?
    将一列字段用逗号分隔开,作为一个显示
    MESQL 数据误操作,恢复数据方法
    有两个frame,在一个frame中获取另一个frame中元素的值
    饼状图显示各类别展示所占百分比
    winfrom中的webbrowser内核版本修改
  • 原文地址:https://www.cnblogs.com/xiaok-redback/p/4329654.html
Copyright © 2011-2022 走看看