问题描述
一共有 n n n个箱子排成一排,从左到右依次编号为 1 ∼ n 1∼n 1∼n。
其中,第 i i i号箱子中放有 a i ai ai个石子。
现在,你可以进行最多 d d d次操作。
每次操作可以将一个石子从一个箱子移动至另一个与其相邻的箱子里。
我们希望通过合理操作使得 1 1 1号箱子内的石子数量尽可能大。
请问,这个最大可能值是多少?
输入格式:
第一行包含整数 T T T,表示共有 T T T组测试数据。
每组数据第一行包含两个整数 n n n和 d d d。
第二行包含 n n n个整数 a 1 , a 2 , … , a n a1,a2,…,an a1,a2,…,an。
输出格式:
每组数据输出一行结果,表示答案。
数据范围
1
≤
T
≤
100
,
1≤T≤100,
1≤T≤100,
1
≤
n
,
d
≤
100
,
1≤n,d≤100,
1≤n,d≤100,
0
≤
a
i
≤
100
0≤ai≤100
0≤ai≤100
输入样例:
3
4 5
1 0 3 2
2 2
100 1
1 8
0
输出样例:
3
101
0
思路
C++代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int T;
cin >> T;
while (T -- )
{
int n, d;
cin >> n >> d;
int res = 0;
//从前往后枚举每个箱子
for (int i = 0; i < n; i ++ )
{
int x;
cin >> x; //读入当前箱子里的数量
if (!i) res += x; //当前箱子就是第一个箱子
else
{
int t = min(x, d / i); //能往第一堆移动多少个 d / i 下取整 最多移动 d/ i次
res += t;
d -= t * i; //操作次数
}
}
cout << res << endl;
}
return 0;
}
#include <iostream>
using namespace std;
const int N = 1010;
int a[N];
int main()
{
int T;
cin >> T;
while (T -- )
{
int n, d;
cin >> n >> d;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
//从第二个箱子开始前往后枚举箱子
for (int i = 2; i <= n; i ++ )
{
while(a[i] != 0 && d >= (i - 1))
{
a[i] --;
a[1] += 1;
d -= (i - 1);
}
}
cout << a[1] << endl;
}
return 0;
}