算法
一次遍历 $O(n)$
从左到右遍历数组,对于每个元素,和当前剩余操作次数进行比较,是否足够可以完全移动到1号位置
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int N = 110;
int T;
int n, d;
int a[N];
int main()
{
cin >> T;
while(T--)
{
cin >> n >> d;
for(int i = 1; i <= n; i++) cin >> a[i];
int res = a[1];
for(int i = 2; i <= n; i++)
{
if(d && a[i])
{
if(a[i]*(i-1) < d) res += a[i], d -= a[i]*(i-1);
else
{
res += d/(i-1);
break;
}
}
}
cout << res << '\n';
}
}