ACM-猪生子问题

这道题是杭电ACM课的第一次测试。当时被c++字符串输入和输出的坑浪费了好多时间,所以没做,现在有空就把它做一下

题目大概意思

某大学生回家养猪致富,第一年他又一只猪(猪第一年是一岁,没有0岁),每只猪在第三年的时候会生4只猪仔,而猪在5岁的时候会被卖掉。现在要求任意输入某一年,求当年该大学生拥有的猪数

例子

input
1
3
5
output
1
5
20

题目分析

看到这种题目,不用说,肯定是列出前几项找规律的。
我们尝试列出前7项

第n年 数量
1 1
2 1
3 生新猪仔 5
4 5
5卖旧猪仔,生新猪仔 20
6 20
7卖旧猪仔,生新猪仔 80

根据题目除了第三年,后面每过三年(如3为第一年,4为第二年,5为第三年这样算三年,因为猪出生当年就算第一年)就有新的猪仔出来而且有旧的猪仔卖出。现在我们可以找规律了
在第三年的时候是1头猪生4只猪仔 所以剩余猪数量为 4 + 1
在第五年的时候卖出前面的1头猪,然后4只猪生猪仔,所以剩余猪数量为4×4 + 4
在第七年的时候卖出前面的4只猪,然后16只猪生猪仔,所以剩余猪数量为4×4×4 + 4×4
所以规律就出来了
第一次生猪仔时猪的数量为41 + 40
第二次生猪仔时猪的数量为42 + 41
第三次生猪仔时猪的数量为43 + 42
所以第n次生猪仔时猪的数量为4n + 4n-1
问题来了,如何将猪仔与年份对应起来。
从上面表可以看出,出了第一次生猪仔,其他生猪仔都是每两年一次, 所以如果第n年是生猪仔年,那么(n-1)/2就可以得到这是第几次生猪仔,而如果第n年不是生猪仔年,那么它的猪的数量等于上一次生猪仔时猪的数量,因为每隔两年就生,所以中间就一年,所以我们再减一次1用(n-1-1)/2就可以得出是第几次生猪仔。
分析完毕。

c++代码如下

#include 
#include 
#include
using namespace std;

int main(){
    double N;
    cin>>N;
    while(N--){
        int year;
        int sum;
        cin>>year;
        if(year < 3){
            sum = 1;
        }
        else if((year - 1)%2 == 0){
            sum = pow(4,(year-1)/2) + pow(4,(year-1)/2 - 1);
        }
        else if((year - 2)%2 == 0){
            sum = pow(4,(year-2)/2) + pow(4,(year-2)/2 - 1);
        }
        cout<

3q for reading - I am Mike

你可能感兴趣的:(ACM-猪生子问题)