HDU 2047-阿牛的EOF牛肉串

阿牛的EOF牛肉串

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 42167    Accepted Submission(s): 19856


题目链接:点击打开链接


Problem Description
今年的ACM暑期集训队一共有18人,分为6支队伍。其中有一个叫做EOF的队伍,由04级的阿牛、XC以及05级的COY组成。在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备在上面刻下一个长度为n的只由"E" "O" "F"三种字符组成的字符串(可以只有其中一种或两种字符,但绝对不能有其他字符),阿牛同时禁止在串中出现O相邻的情况,他认为,"OO"看起来就像发怒的眼睛,效果不好。

你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗?

PS: 阿牛还有一个小秘密,就是准备把这个刻有 EOF的牛肉干,作为神秘礼物献给杭电五十周年校庆,可以想象,当校长接过这块牛肉干的时候该有多高兴!这里,请允许我代表杭电的ACMer向阿牛表示感谢!

再次感谢!
 

Input
输入数据包含多个测试实例,每个测试实例占一行,由一个整数n组成,(0
 

Output
对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
 

Sample Input
 
   
1 2
 

Sample Output
 
   
3 8
 

分析:

这题是个规律题,列出几项找规律就会发现,当 n =1 时,有三种情况,当 n = 2 时,有 8 种情况,因为可以在上一轮的基础上再在后面加一个字母就行了,上一轮有三种情况,分别为 E ,O,F,所以可以在 E 后面任意加上一个字母有三种情况,在 O 后面加上一个字母,有两种情况,因为不能出现 OO 的情况,在 F 后面任意加上一个字母有三种情况,所以就是 2*3+(3-2)*2=8,同理可得,当 n 等于 3 的时候,就有 6*3+(8-6)*2 = 22,当 n 等于 4 的时候,就有 6*2+(22-6)*3 =60,当 n 等于 5 的时候,就有 16*2+(60-16)*3 =164. 这时就可以发现规律了,除了 n 等于 1 或者 2,如果上一轮是 a*3+b*2=c;那么本轮就是 a*2+(c-a)*3,好了,(注意本题的数量大,要用long long int ,我就是有两个一个中间变量没有用long long int ,一直wa)一起来看看代码吧!


#include
#include
#include
#include
#include
using namespace std;

long long int Search(int n)
{
    long long int p=0,q=1;///根据第一轮结果是3,设定的初始值(这两个家伙就是分析中提到的中间变量)
    long long int ans=0;
    for(int i=1;i<=n;i++)
    {
        ans=p*2+q*3;
        p=q;
        q=ans-p;
    }
    return ans;
}

int main()
{
    int n;
    long long int m;
    while(~scanf("%d",&n))
    {
       m=Search(n);
        printf("%lld\n",m);
    }
    return 0;
}











你可能感兴趣的:(ACM-思维题)