华师一附中OI组
标题:
奇怪的数列(2X+1 3X+2)
[打印本页]
作者:
admin
时间:
2018-5-12 23:12
标题:
奇怪的数列(2X+1 3X+2)
有一个数列是递增序列,第一个元素是1,后面的每个数都是前面某个数的2倍+1或者3倍+2,求第100个数。
作者:
admin
时间:
2018-5-12 23:15
#include<iostream>
using namespace std;
const int mm=10000;
int a[mm];
int head,tail;
bool b;
int x,x1,x2,i,j;
int main()
{
a[0]=1;
head=tail=0;
b=true;
while (b && (head<=tail) && (tail<=mm-100))
{
x=a[head];
x1=2*x+1;
///找head和tail之间那个数字>=x1
///=就不管了 >就将此数字以及后面的数字挪一位,腾个空间给x1
i=tail;
while (a[i]>x1) i--; ///隐含一个条件a[head]<x
if (a[i]<x1)
{
for (j=tail; j>=i+1; j--) a[j+1]=a[j]; ///挪出空间
a[i+1]=x1;tail++; ///进队列
}
x2=3*x+2;
i=tail;
while (a[i]>x2) i--;
if (a[i]<x2)
{
for (j=tail; j>=i+1; j--) a[j+1]=a[j];
a[i+1]=x2;tail++;
}
head++;
if (head>=100) b=false; ///只要找到前100项
}
if (!b) for (i=0; i<=99; i++ ) cout<<a[i]<<' ';
}
复制代码
作者:
admin
时间:
2018-5-12 23:15
#include<iostream>
using namespace std;
const int mm=10000;
int a[mm];
int head,tail;
bool b;
int x,x1,x2,i,j;
int main()
{
a[0]=1;
head=tail=0;
b=true;
while (b && (head<=tail) && (tail<=mm-100))
{
x=a[head];
x1=2*x+1;
///找head和tail之间那个数字>=x1
///=就不管了 >就将此数字以及后面的数字挪一位,腾个空间给x1
i=tail;
while (a[i]>x1) i--; ///隐含一个条件a[head]<x
if (a[i]<x1)
{
for (j=tail; j>=i+1; j--) a[j+1]=a[j]; ///挪出空间
a[i+1]=x1;tail++; ///进队列
}
x2=3*x+2;
i=tail;
while (a[i]>x2) i--;
if (a[i]<x2)
{
for (j=tail; j>=i+1; j--) a[j+1]=a[j];
a[i+1]=x2;tail++;
}
head++;
if (head>=100) b=false; ///只要找到前100项
}
if (!b) for (i=0; i<=99; i++ ) cout<<a[i]<<' ';
}
复制代码
作者:
黄煦喆
时间:
2018-8-18 17:58
#include<iostream>
#include<queue>
using namespace std;
int n,x;
priority_queue<int,vector<int>,greater<int> >pq;
bool b[10000000];
int main()
{
pq.push(1);
b[1]=1;
while(!pq.empty()&&n<100)
{
x=pq.top();
pq.pop();
n++;
if(!b[2*x+1])pq.push(2*x+1);
b[2*x+1]=1;
if(!b[3*x+2])pq.push(3*x+2);
b[3*x+2]=1;
}
cout<<x;
return 0;
}
复制代码
作者:
admin
时间:
2018-8-19 10:09
楼上同学会用 优先队列了! 好牛呀 !为什么不顺便y弄个set判重呢
作者:
黄煦喆
时间:
2018-8-25 16:36
admin 发表于 2018-8-19 10:09
楼上同学会用 优先队列了! 好牛呀 !为什么不顺便y弄个set判重呢
之前没想到,谢谢老师提醒
作者:
黄煦喆
时间:
2018-8-25 16:38
#include<iostream>
#include<queue>
#include<set>
using namespace std;
int n,x;
priority_queue<int,vector<int>,greater<int> >pq;
set<int>s;
int main()
{
pq.push(1);
s.insert(1);
while(!pq.empty()&&n<100)
{
x=pq.top();
pq.pop();
n++;
if(!s.count(2*x+1))pq.push(2*x+1);
s.insert(2*x+1);
if(!s.count(3*x+2))pq.push(3*x+2);
s.insert(3*x+2);
}
cout<<x;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2