题目描述
初始时有n个标号为1 ~ n(n <= 20)的杯子,第i个杯子中含有m[i] (0 <= m[i] <= 20) 个石子。 我们定义如下为一次操作: 从某个杯子(假定为第i个)中拿走一个石子,同时在前i - 1个杯子中各加上一个石子。 (如果在1号杯子中拿走一个石子,那么没有杯子会加上新石子)。 当所有的杯子都空了以后,游戏结束。 那么我们最少需要多少步去结束这个游戏呢?
输入
输入含有多个case。 每个case的第一行含有一个整数n, 代表杯子的个数。 每个case的第二行含有n个整数,分别代表初始状态下,1 ~ n 号杯子中石子的个数。 当n = 0时代表输入的结束。
输出
对于每个case, 输出结束游戏需要的最少步数。
样例输入
10
3 3 3 3 3 3 3 3 3 3
5
1 2 3 4 5
0
样例输出
3069
初始时有n个标号为1 ~ n(n <= 20)的杯子,第i个杯子中含有m[i] (0 <= m[i] <= 20) 个石子。 我们定义如下为一次操作: 从某个杯子(假定为第i个)中拿走一个石子,同时在前i - 1个杯子中各加上一个石子。 (如果在1号杯子中拿走一个石子,那么没有杯子会加上新石子)。 当所有的杯子都空了以后,游戏结束。 那么我们最少需要多少步去结束这个游戏呢?
输入
输入含有多个case。 每个case的第一行含有一个整数n, 代表杯子的个数。 每个case的第二行含有n个整数,分别代表初始状态下,1 ~ n 号杯子中石子的个数。 当n = 0时代表输入的结束。
输出
对于每个case, 输出结束游戏需要的最少步数。
样例输入
10
3 3 3 3 3 3 3 3 3 3
5
1 2 3 4 5
0
样例输出
3069
129
简单的推导
假设
10
2 0 0 0 0 0 0 0 0 0
可推导出公式:
sum += s[i]*pow(2,i);
源代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
while(cin>>n&&n)
{
int s[22]={0},sum=0;
for(int i=0;i<n;i++)
{
cin>>s[i];
sum += s[i]*pow(2,i);
}
cout<<sum<<endl;
}
return 0;
}