zoukankan      html  css  js  c++  java
  • noi2729 Blah数集

    Blah数集

    大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下:
    (1) a是集合Ba的基,且a是Ba的第一个元素;
    (2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中;
    (3)没有其他元素在集合Ba中了。
    现在小高斯想知道如果将集合Ba中元素按照升序排列,第N个元素会是多少?
    Input
    输入包括很多行,每行输入包括两个数字,集合的基a(1<=a<=50))以及所求元素序号n(1<=n<=1000000)
    Output
    对于每个输入,输出集合Ba的第n个元素值
    Sample Input
    1 100
    28 5437
    Sample Output
    418

    900585

    题目分析:本来想着要省事,用优先队列吧,虽然知道n=10^6 ,优先队列nlong(n)要超时,还是想随便写写,看过几个点,结果一个也不过。

    本题要要递增的数列,所以用单调队列。定义两个队头指针,head2,head3分别代表2*x+1,3*x+1;比较head2和head3,谁小谁入队列,入队列后指针后移,如果相等,只入一次,两个指针都后移。0(n)的做法,本来要800多ms,用位运算后能到500多Ms。

    代码;

    #include<iostream>
    #include<cstdio>
    using namespace std;
    long long q[1000010];
    long long a,n,head2,head3,tail;
    void work(){
       head2=1;//2*x+1; 
        head3=1;//3*x+1;
        tail=1;
        q[1]=a;
        while(tail<n){ 
        long long t1=(q[head2]<<1)+1, t2=(q[head3]<<1)+q[head3]+1;         
          if(t1<t2){ //2*q[head2]+1<3q[head3 ] +1           
                 q[++tail]=t1;
                 head2++;
           }
           else{
                 if(t1>t2){
                     q[++tail]=t2;
                     head3++;
                 }
                 else{//相等,重复的数,只进一次栈 
                     q[++tail]=t1;
                     head3++;
                     head2++;
                 }
           }
        }
         printf("%d
    ",q[tail]);
    }
    int main(){
       while(scanf("%d%d",&a,&n)>0)
             work();
       return 0;
    }
  • 相关阅读:
    Open source cryptocurrency exchange
    Salted Password Hashing
    95. Unique Binary Search Trees II
    714. Best Time to Buy and Sell Stock with Transaction Fee
    680. Valid Palindrome II
    Java compiler level does not match the version of the installed Java project facet.
    eclipse自动编译
    Exception in thread "main" java.lang.StackOverflowError(栈溢出)
    博客背景美化——动态雪花飘落
    java九九乘法表
  • 原文地址:https://www.cnblogs.com/FuTaimeng/p/5590812.html
Copyright © 2011-2022 走看看