这道题是杭电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<