·贪吃的小Q
小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力?
我的思路并不是从总的M块巧克力出发,而是从第一天吃s块巧克力,n天后,会吃掉多少块巧克力?之后再将求得的num块巧克力和题目给出的m块巧克力对比,如果相等那么输出s。这种方法缺点就是时间复杂度很大为O(n^2),所以在Test函数中想办法减小了时间复杂度,最终也算能跑过去了。(不过这也是个笨方法了)
代码如下:
#include<iostream>
using namespace std;
int Test(int n,int s)
{
int num = s;
int i = 0;
for (i = 1; i < n; i++)
{
if (s== 1)
{
num = num+(n-i);//这个地方不要写成num=num+1;会导致复杂度过大
break;
}
else if (s % 2 == 0)
{
num = num+(s / 2);
s = s / 2;
}
else
{
num = num+(s / 2) + 1;
s = (s / 2) + 1;
}
}
return num;
}
int main()
{
int n ;
int m ;
int s;
int num1, num2, num3;
scanf("%d%d", &n, &m);
for (s = 1; s <= 28000; s++)
{
num1 = Test(n, s);
num2 = Test(n, s + 1);
if (m >= num1&&m <num2)
{
break;
}
}
printf("%d\n", s);
system("pause");
return 0;
}