华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1944|回复: 6
打印 上一主题 下一主题

奇怪的数列(2X+1 3X+2)

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-5-12 23:12:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有一个数列是递增序列,第一个元素是1,后面的每个数都是前面某个数的2倍+1或者3倍+2,求第100个数。
回复

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
沙发
 楼主| 发表于 2018-5-12 23:15:43 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. const int mm=10000;
  4. int a[mm];
  5. int head,tail;
  6. bool b;
  7. int x,x1,x2,i,j;
  8. int main()
  9. {
  10.     a[0]=1;
  11.     head=tail=0;
  12.     b=true;
  13.     while (b && (head<=tail) && (tail<=mm-100))
  14.     {
  15.         x=a[head];
  16.         x1=2*x+1;
  17.         ///找head和tail之间那个数字>=x1
  18.         ///=就不管了 >就将此数字以及后面的数字挪一位,腾个空间给x1
  19.         i=tail;
  20.         while (a[i]>x1) i--;  ///隐含一个条件a[head]<x
  21.         if (a[i]<x1)
  22.         {
  23.             for (j=tail; j>=i+1; j--) a[j+1]=a[j];  ///挪出空间
  24.             a[i+1]=x1;tail++; ///进队列
  25.         }
  26.         x2=3*x+2;
  27.         i=tail;
  28.         while (a[i]>x2) i--;
  29.         if (a[i]<x2)
  30.         {
  31.             for (j=tail; j>=i+1; j--) a[j+1]=a[j];
  32.             a[i+1]=x2;tail++;
  33.         }
  34.         head++;
  35.         if (head>=100) b=false;    ///只要找到前100项
  36.     }
  37.     if (!b) for (i=0; i<=99; i++ ) cout<<a[i]<<' ';
  38. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
板凳
 楼主| 发表于 2018-5-12 23:15:46 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. const int mm=10000;
  4. int a[mm];
  5. int head,tail;
  6. bool b;
  7. int x,x1,x2,i,j;
  8. int main()
  9. {
  10.     a[0]=1;
  11.     head=tail=0;
  12.     b=true;
  13.     while (b && (head<=tail) && (tail<=mm-100))
  14.     {
  15.         x=a[head];
  16.         x1=2*x+1;
  17.         ///找head和tail之间那个数字>=x1
  18.         ///=就不管了 >就将此数字以及后面的数字挪一位,腾个空间给x1
  19.         i=tail;
  20.         while (a[i]>x1) i--;  ///隐含一个条件a[head]<x
  21.         if (a[i]<x1)
  22.         {
  23.             for (j=tail; j>=i+1; j--) a[j+1]=a[j];  ///挪出空间
  24.             a[i+1]=x1;tail++; ///进队列
  25.         }
  26.         x2=3*x+2;
  27.         i=tail;
  28.         while (a[i]>x2) i--;
  29.         if (a[i]<x2)
  30.         {
  31.             for (j=tail; j>=i+1; j--) a[j+1]=a[j];
  32.             a[i+1]=x2;tail++;
  33.         }
  34.         head++;
  35.         if (head>=100) b=false;    ///只要找到前100项
  36.     }
  37.     if (!b) for (i=0; i<=99; i++ ) cout<<a[i]<<' ';
  38. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
地板
发表于 2018-8-18 17:58:18 | 只看该作者
  1. #include<iostream>
  2. #include<queue>
  3. using namespace std;
  4. int n,x;
  5. priority_queue<int,vector<int>,greater<int> >pq;
  6. bool b[10000000];
  7. int main()
  8. {
  9.     pq.push(1);
  10.     b[1]=1;
  11.     while(!pq.empty()&&n<100)
  12.     {
  13.         x=pq.top();
  14.         pq.pop();
  15.         n++;
  16.         if(!b[2*x+1])pq.push(2*x+1);
  17.         b[2*x+1]=1;
  18.         if(!b[3*x+2])pq.push(3*x+2);
  19.         b[3*x+2]=1;
  20.     }
  21.     cout<<x;
  22.     return 0;
  23. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
5#
 楼主| 发表于 2018-8-19 10:09:15 | 只看该作者
楼上同学会用 优先队列了! 好牛呀 !为什么不顺便y弄个set判重呢
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
6#
发表于 2018-8-25 16:36:18 | 只看该作者
admin 发表于 2018-8-19 10:09
楼上同学会用 优先队列了! 好牛呀 !为什么不顺便y弄个set判重呢

之前没想到,谢谢老师提醒
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
7#
发表于 2018-8-25 16:38:41 | 只看该作者
  1. #include<iostream>
  2. #include<queue>
  3. #include<set>
  4. using namespace std;
  5. int n,x;
  6. priority_queue<int,vector<int>,greater<int> >pq;
  7. set<int>s;
  8. int main()
  9. {
  10.     pq.push(1);
  11.     s.insert(1);
  12.     while(!pq.empty()&&n<100)
  13.     {
  14.         x=pq.top();
  15.         pq.pop();
  16.         n++;
  17.         if(!s.count(2*x+1))pq.push(2*x+1);
  18.         s.insert(2*x+1);
  19.         if(!s.count(3*x+2))pq.push(3*x+2);
  20.         s.insert(3*x+2);
  21.     }
  22.     cout<<x;
  23.     return 0;
  24. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-27 02:29 , Processed in 0.103848 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表