天天看点

第六届蓝桥杯(国赛)——机器人繁殖

问题描述

X 星系的机器人可以自动复制自己。它们用 1 年的时间可以复制出 2 个自己,然后就失去复制能力。

每年 X 星系都会选出 1 个新出生的机器人发往太空。也就是说,如果 X 星系原有机器人 5 个。

1 年后总数是:5 + 9 = 14

2 年后总数是:5 + 9 + 17 = 31

如果已经探测经过 n 年后的机器人总数 s,你能算出最初有多少机器人吗?

输入格式

输入一行两个数字 n 和 s,用空格分开,含义如上。n不大于100,s 位数不超过 50 位。

输出格式

要求输出一行,一个整数,表示最初有机器人多少个。

样例输入1

2 31

样例输出1

5

样例输入2

97 2218388550399401452619230609499

样例输出2

8

题解一

枚举:

#include <iostream>
using namespace std;

int main()
{
	double n, s;
	cin >> n >> s;
	
	for (double i = 1; i <= s; i ++)
	{
		double cnt = i, tmp = i;
		for (int j = 1; j <= n; j ++)
		{
			tmp = 2 * tmp - 1;
			cnt += tmp;			
		}
		
		if(cnt == s) 
		{
			cout << i << endl;
			return 0;
		}
	}
}
           

ps:数据比较水?如果总量特别大,然后时间特别少,不就超时了嘛

题解二

推公式:

设初始机器人数量为

x

第 1 列为当年新生机器人数量,第 2 列为当年机器人的总数量

第一年

:2x - 1;3x - 1

第二年

:4x - 3;7x - 4

第三年

:8x - 7;15x - 11

...

第 n 年总数

:(2n+1 - 1) * x - 2n+1 + 2 + n

∴ x = (s + 2n+1 - 2 - n) / (2n+1 - 1)

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
	double n, s;
	cin >> n >> s;
	
	cout << (s - 2 - n + pow(2, n + 1)) / (pow(2, n + 1) - 1) << endl;
	return 0;
}
           

继续阅读