Blash数集这道题是小酱我在期中考试的时候做的,这道题是队列里一道非常经典的,堪比约瑟夫问题,今天我们就来简单了解一下它:
题目描述:
大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对应以a为基的集合Ba定义如下:
(1)a是集合Ba的基,且a是Ba的第一个元素;
(2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中;
(3)没有其他元素在集合Ba中了。
现在小高斯想知道如果将集合Ba中元素按照升序排列,第n个元素会是多少?
说实话,小酱我第一眼直接看懵(TAT)队列题还要用集合?!??!只能说我太难了~~
但后来发现并不是这么回事,实际上,遇到这种新无厘头题,首先先写一大堆头文件,你知道的都写上,写完以后如果还没有思路再去写一些“计算a+b/c的值”,“输出Hello,World”这样的题,以捋一捋思路(真正OI时不要这样做),说不定写写就出来了。
样例输人输出也还行,数据也不是很大,
In:
1 100
28 5437
Out:
418
900585
1<=n<=1000000,1<=a<=50
CCF NOI的官方题库上(oj.noi.cn)给的时间限制是1000ms,内存超级大,262144个KB,没办法,谁让是CCF的呢?~
样例代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<cctype>
using namespace std;
int a,n,m[1000005],t2,t3,t,ta;
int main()
{
while(cin>>a>>n)
{
m[1]=a;
t2=1;
t3=1;
ta=2;
while(ta<=n)
{
int x2=0,x3=0;
x2=m[t2]*2+1;
x3=m[t3]*3+1;
t=min(x2,x3);
if(x2>x3)
t3++;
else
t2++;
if(m[ta-1]!=t)
m[ta++]=t;
}
cout<<m[n]<<endl;
}
return 0;
}
能看懂吧?!
---------------------------------------------------------ND!---------------------------------------------
本文介绍了Blash数集的概念,源于数学家高斯发现的一种有趣集合。Blash数集定义包含特定规则,并提出了求解集合中按升序排列的第n个元素的问题。解题策略建议先尝试编写基础代码框架,通过简单的计算来启发思路。样例输入输出和题目约束给出,包括时间限制和内存限制,适用于编程竞赛环境。
1993

被折叠的 条评论
为什么被折叠?



