HDOJ 1021 分析

本题的难点在于如果用普通的办法:如递归,循环均会超时或者堆栈溢出,因此,我们需要寻找规律。

大家不妨可以先看以下代码:

#include<iostream>
using namespace std;

int Fiobonacci(int n)
{
    if(n == 0) return 7;
    if(n == 1) return 11;
    return Fiobonacci(n-1) + Fiobonacci(n-2);
}

int main()
{
    int fn,n;
    for(n = 0;n < 1000;n++)
    {
        fn = Fiobonacci(n);
        cout<<fn%3<<" ";
        if((n+1) % 8 == 0)
            cout<<endl;
    }
    return 0;
}

运行结果为:

可以看出:每八个数从n=0到n=7之间f[n]%3={1,2,0,2,2,1,0,1},之后就一直按照这个规律一直下去。

但是也可以在程序运行的过程中发现程序运行越来越慢,因此根本无法满足题目的时间限制。

以下是根据这个思路设计的代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int main(){
 4     int n;
 5     int f[8];
 6     f[0]=7%3;
 7     f[1]=11%3;
 8     for(int i=2;i<8;i++)
 9           f[i]=(f[i-1]+f[i-2])%3;
10
11     while(scanf("%d",&n)!=EOF)
12     {
13          if(f[n%8]==0)
14              printf("yes\n");
15          else
16              printf("no\n");
17      }
18     return 0;
19 }
时间: 2024-08-04 10:47:41

HDOJ 1021 分析的相关文章

2014上海全国邀请赛题解 HDOJ 5090-5099

HDOJ 5090 水题,从小到大排序,可以填充达到符合条件的,先填充好,填充之后进行调整. 传送门:点击打开链接 #include <cstdio> #include <cmath> #include <queue> #include <map> #include <vector> #include <cstring> #include <algorithm> using namespace std; const int

1021 Fibonacci Again (hdoj)

Problem Description There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2). Input Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000). Output Print the word "yes" if

hdoj 5355 Cake(分析+二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 分蛋糕的题目,有1-n大小的n个蛋糕,要求平均分成m份,不能切开蛋糕 1 #include<stdio.h> 2 #include<set> 3 using namespace std; 4 int main(){ 5 set<int>s; 6 set<int>::iterator it; 7 long long n; 8 int m; 9 int par

hdoj 4786 Fibonacci Tree 【生成树+想法】

题目:hdoj 4786 Fibonacci Tree 题意:给出 n 个点 m 条边的图,边只有两种颜色,白色和黑色,让你判断能不能让一个生成树中白边的个数为斐波那契数. 分析:这是个想法题目,前提是知道生成树的定义:生成树必须是所有点都在树中 那么既然要是斐波那契数,我只要把白色边的最大个数和最小个数求出来,如果这个范围内有斐波那契数的话,那么就满足条件. 当然这样求的前提条件是期间的所有的生成树都是满足条件的.即都是满足能够生成树的. ok,AC代码: #include<iostream>

hdoj 3157 Crazy Circuits 【有下界最小流】

题目:hdoj 3157 Crazy Circuits 题意:现在要制造一个电路板,电路板上有 n 个电子元件,各个元件之间有单向的电流流向,然后有一个 + ,电流进入, -- 电流汇入,然后判断能不能让电路板工作,如果能的话求最小电流. 分析:有上下界网络流,求最小流 首先是判断能不能够让电路板工作,能工作的条件就是流量平衡,判断方法前面题目中讲过. 同样先转换为无源汇网络流问题,添加t→ s边权为无穷.那么最小流不就是在满足所有下界的情况的流么.即上面提到的,求得SS→ TT的最大流之后,其

hdoj 4971 A simple brute force problem. 【最大闭合权 --&gt; 最小割】

题目:hdoj 4971 A simple brute force problem. 题意:给出 n 个任务和 m 项技术,完成某个任务需要其中几项技术,完成某个任务有奖金,学习某个技术需要钱,技术之间有父子关系,某项技术可能需要先学习其他技术,然后问你选择做那些任务获得收益最大? 分析:看题意的黑体字部分,就是一个标准的闭合权问题,这个题目的关键忽悠点在于技术之间的关系,导致很多人想到了dp以及树形dp. 其实就是一个闭合权问题模板,官方题解说如果技术之间存在相互的关系需要缩点,其实不用缩点也

HDOJ多校联合第五场

1001 题意:求逆序对,然后交换k次相邻的两个数,使得剩下的逆序对最少. 分析:题目用到的结论是:数组中存在一对逆序对,那么可以通过交换相邻两个数使得逆序对减少1,交换k次,可以最多减少k个. 嘉定ai>aj,i < j,如果ai,aj相邻的,那么显然可以通过交换减少1:不相邻的情况, 考虑ak,k = j-1; #11:ak > aj,那么ak,aj构成逆序对,交换后逆序对减少1: #12:ak<=aj,那么ai,ak构成逆序对,问题转化为更小规模,可以通过同样的方法进一步分析

HDOJ 3622 Bomb Game 2-sat

http://acm.hdu.edu.cn/showproblem.php?pid=3622 题意:上个月写的,题目好像是说一对点要选一个引爆,引爆半径自己选,任意两圆不能相交,最后分数是所有圆的最小半径,求最大分数. 分析:二分半径,2-sat判定可行性. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 using namespace std;

HDOJ 1001

HDOJ 1001: 题目:输入一个整数n,计算sum(n)=1+2+3+...+n,每个测试案例输出间空一行. 分析:水题.注意在while循环里每计算一次要对sum值进行清零. 代码: #include <iostream> #include <stdio.h> using namespace std; int n; int sum=0; int main() { while(scanf("%d",&n) != EOF){ for(int i=n;i