四道题的难度: 2591<1338<2545<2247

POJ 2591 Set Definition:

这是从discuss里看来的,写的挺好,直接copy,根据我的代码稍有改动(其实也就只改动了一个数字):

题目所给的是个简单的双递归。

我们注意到任何新的元素必然是集合中较小的元素经过两种之一的递推得到的。
这启发我们两个设置标记(比如two,three两个变量):第一个是以方式乘2加1递推,two是没有用过的最小项下标,
第二则表示以乘3加1的方式递推,three是没有用过的最小项下标。开始two =0,three=0,都指向最小的元素0。
然后比较两种递推得到的结果,取较小的放到数组中(这样就得到了一个新的集合元素),并更新相应的下标。
如果相同,只放进去一个,两个下标同时更新。这样可以线性的求出前N个元素。

#include <iostream>
#include <stdio.h>
#include <map>
#include <string.h>
#include <algorithm> using namespace std;
const long maxn=;
long num[maxn];
int two,three;
int idx;
void init(){
memset(num,,sizeof(num));
idx=;
num[]=;
two=three=;
for(int i=;i<maxn;i++){
if(*num[two]==*num[three]){
num[++idx]=*num[two]+;
two++;
three++;
}
else if(*num[two]<*num[three]){
num[++idx]=*num[two]+;
two++;
}
else{
num[++idx]=*num[three]+;
three++;
}
}
}
int main()
{
init();
int n;
while(scanf("%d",&n)!=EOF){
printf("%d\n",num[n]);
}
return ;
}

附上discuss里大牛的写法:

#include<stdio.h>
#define Min(a, b) ((a)<(b)?(a):(b))
#define N 10000001
long f[N];
int main()
{
int n,i;
int x_2 = ,x_3 = ;
f[x_2] = ;
f[x_3] = ;
for(i=; i<=; i++)
{
f[i] = Min(f[x_2]*+, f[x_3]*+); if(f[i] == f[x_2]*+)
x_2++;
if(f[i] == f[x_3]*+)
x_3++;
}
while(scanf("%d",&n) != EOF)
{
printf("%ld\n",f[n]);
}
return ;
}

接下来三道题,和上面类似,就不说了,直接附上代码:

POJ 1338 Ugly Numbers

#include <iostream>
#include <stdio.h>
#include <map>
#include <string.h>
#include <algorithm> using namespace std;
const long maxn=;
long num[maxn];
int two,three,five; void init(){
memset(num,,sizeof(num));
num[]=;
two=three=five=;
for(int i=;i<maxn;i++){
num[i]=min(*num[two],min(*num[three],*num[five]));
if(num[i]==*num[two])
two++;
if(num[i]==*num[three])
three++;
if(num[i]==*num[five])
five++;
}
}
int main()
{
int n;
init();
while(scanf("%d",&n),n){
printf("%d\n",num[n]);
}
return ;
}

POJ 2545 Hamming Problem

#include <iostream>
#include <stdio.h>
#include <map>
#include <string.h>
#include <algorithm>
#include <string>
/*
本来抱着试一试的态度,再获取n的大小(也就是题目中的i)之后,再建立数组。
本来以为会RE,没想到AC。。。
后来在discuss中看到有人说,在满足output<10^18的情况下,用 2,3,5算出来的最大i大概在10000左右
晕。。。 */
using namespace std;
long long p1,p2,p3;
long long pp1,pp2,pp3;
long long n; int main()
{
scanf("%I64d%I64d%I64d%I64d",&p1,&p2,&p3,&n);
long long *num;
num=new long long[n+];
num[]=;
pp1=pp2=pp3=;
for(int i=;i<=n;i++){
num[i]=min(p1*num[pp1],min(p2*num[pp2],p3*num[pp3]));
if(num[i]==p1*num[pp1])
pp1++;
if(num[i]==p2*num[pp2])
pp2++;
if(num[i]==p3*num[pp3])
pp3++;
}
cout<<num[n]<<endl;
return ;
}

POJ 2247 Humble Numbers

#include <iostream>
#include <stdio.h>
#include <map>
#include <string.h>
#include <algorithm>
#include <string> //刚开始忘记导入了。。。 using namespace std;
const long maxn=;
long long num[maxn];
int two,three,five,seven;
map<int,string> form;
void init(){
memset(num,,sizeof(num));
num[]=;
two=three=five=seven=;
for(int i=;i<maxn;i++){
num[i]=min(*num[two],min(*num[three],min(*num[five],*num[seven])));
if(num[i]==*num[two])
two++;
if(num[i]==*num[three])
three++;
if(num[i]==*num[five])
five++;
if(num[i]==*num[seven])
seven++;
}
form[]="th";
form[]="st";
form[]="nd";
form[]="rd";
form[]="th";
form[]="th";
form[]="th";
form[]="th";
form[]="th";
form[]="th";
//注意下面三个。。。
form[]="th";
form[]="th";
form[]="th"; }
int main()
{
int n;
init();
while(scanf("%d",&n),n){
int tmp1=n%,tmp2=n%; //额额,一开始就只考虑了两位数的情况。。。
if(tmp2==||tmp2==||tmp2==)
cout<<"The "<<n<<form[tmp2]<<" humble number is "<<num[n]<<"."<<endl;
else if(tmp1==||tmp1==||tmp1==)
cout<<"The "<<n<<form[tmp1]<<" humble number is "<<num[n]<<"."<<endl;
else{
cout<<"The "<<n<<form[tmp1]<<" humble number is "<<num[n]<<"."<<endl;
}
}
return ;
}

POJ 2591 1338 2545 2247(数列递归衍生问题,思路挺妙)的更多相关文章

  1. day18 时间:time:,日历:calendar,可以运算的时间:datatime,系统:sys, 操作系统:os,系统路径操作:os.path,跨文件夹移动文件,递归删除的思路,递归遍历打印目标路径中所有的txt文件,项目开发周期

    复习 ''' 1.跨文件夹导包 - 不用考虑包的情况下直接导入文件夹(包)下的具体模块 2.__name__: py自执行 '__main__' | py被导入执行 '模块名' 3.包:一系列模块的集 ...

  2. Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

    Reverse反转算法 #include <iostream> using namespace std; //交换的函数 void replaced(int &a,int & ...

  3. POJ 1321-棋盘问题(DFS 递归)

    POJ 1321-棋盘问题 K - DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I6 ...

  4. PHP算法之斐波那契数列(递归)

    /*斐波那契数列 源代码分析 f(x) = 1 ; 当 x < 2 ; f(x) = f(x-1)+f(x-2); 当 x >= 2 ; 通项式为:fn ={((1+根号5)/2)^n-( ...

  5. python之斐波那契数列递归推导在性能方面的反思

    在各种语言中,谈到递归首当其冲的是斐波那契数列,太典型了,简直就是标杆 一开始本人在学习递归也是如此,因为太符合逻辑了 后台在工作和学习中,不断反思递归真的就好嘛? 首先递归需要从后往前推导,所有数据 ...

  6. UVaLive 3357 Pinary (Fib数列+递归)

    题意:求第 k 个不含前导 0 和连续 1 的二进制串. 析:1,10,100,101,1000,...很容易发现长度为 i 的二进制串的个数正好就是Fib数列的第 i 个数,因为第 i 个也有子问题 ...

  7. POJ 1780 Code(欧拉回路+非递归dfs)

    http://poj.org/problem?id=1780 题意:有个保险箱子是n位数字编码,当正确输入最后一位编码后就会打开(即输入任意多的数字只有最后n位数字有效)……要选择一个好的数字序列,最 ...

  8. java递归 斐波那契数列递归与非递归实现

    递归简单来说就是自己调用自己, 递归构造包括两个部分: 1.定义递归头:什么时候需要调用自身方法,如果没有头,将陷入死循环 2.递归体:调用自身方法干什么 递归是自己调用自己的方法,用条件来判断调用什 ...

  9. [剑指offer] 7. 斐波那契数列 (递归 时间复杂度)

    简介: 杨辉三角每条斜线上的数之和就构成斐波那契数列. 思路: 参考文章:https://mp.weixin.qq.com/s?src=11&timestamp=1551321876& ...

随机推荐

  1. SegmentFault 2014黑客马拉松 北京 作品demo

    1号作品展示——最熟悉的陌生人 app 利用录音(声纹识别)和照片来让好久不见的见面变得不那么尴尬. 2号作品展示——神奇魔镜 app 灵感来自通话<白雪公主>,穿越到今天的“魔镜”功能依 ...

  2. 多线程基本概论multithread

    多线程 基本概念 进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 通过 活动监视器 可以查看 Mac 系统中所开启的进程 线程 进程要想 ...

  3. Power of Four

    Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example:Giv ...

  4. 在SQL Server 2012中新建用户

    一.问题描述 在最开始装SQL Server 2012时我选择的是Windows身份认证方式,现在想添加一个用户采用SQL Server身份验证. 二.具体思路 1.新建用户 2.将新建的用户添加到相 ...

  5. 基于AppCan MAS系统,如何轻松实现移动应用数据服务?

    完成一个移动应用开发,前端提供页面展示,当它要与一些业务系统进行交互,又该如何实现呢?2016AppCan移动开发者大会上,AppCan前端开发经理杨庆,分享了AppCan轻松实现移动应用数据服务的方 ...

  6. Windows Phone中使用Native Code

    前言      Windows Phone 8 SDK中一个非常有用的特性,就是可以通过Windows Phone Runtime Component (WinPRT)使用C++代码来处理运算量大的任 ...

  7. Modal的跳转方法为什么会显得那么奇怪

    初学Modal Segue的时候,并不能理解它为什么要做成这样.从A界面跳转到B界面还算正常,但是从B界面返回A界面,就显得略显猎奇了.必须先在A界面的Controller中自己造个方法@IBActi ...

  8. Android编程: fragment组件、菜单和Intent组件

    学习内容:fragment组件.菜单和Intent组件 ====fragment组件====1.fragment是一种自我容纳,模块化的,嵌入在一个Activity里面的视图组件    可以在运行时动 ...

  9. [DHCP服务]——DHCP详解

    DHCP:(Dynamic Host Configuration Protocol) 动态主机配置协议 1. DHCP是一个局域网的网络协议,采用UDP协议工作 2. DHCP作用 (1)主要应用在大 ...

  10. Ant学习---第五节:Ant_Junit介绍(基于3的版本)

    Junit3 和 Junit4 有本质上的区别 1.普通java类,代码如下: package learn.junit; public class HelloWorld { public String ...