一共有 n 个箱子排成一排,从左到右依次编号为 1∼n。
其中,第 i 号箱子中放有 ai 个石子。
现在,你可以进行最多 d 次操作。
每次操作可以将一个石子从一个箱子移动至另一个与其相邻的箱子里。
我们希望通过合理操作使得 1 号箱子内的石子数量尽可能大。
请问,这个最大可能值是多少?
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含两个整数 n 和 d。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
每组数据输出一行结果,表示答案。
数据范围
1≤T≤100,
1≤n,d≤100,
0≤ai≤100
输入样例:
3
4 5
1 0 3 2
2 2
100 1
1 8
0
输出样例:
3
101
0
个人思路:
定义一个数组用来存放每个箱子 数组的下标就可以看作 每个箱子距离第一个箱子的路程
当操作次数d>g[i]*i 表示剩余的次数可以让 第i个箱子的石头全部搬到第一个箱子里
当操作次数d>i表示剩余的次数 可以让部分第i个箱子里面的石子搬到第一个箱子里(这里要用while循环)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=105;
int g[N];
int T,n,d;
int main(){
cin>>T;
while(T--){
cin>>n>>d;
memset(g,N,0);
for(int i=0;i<n;i++){
cin>>g[i];
}
for(int i=1;i<n;i++){
if(d>=g[i]*i){
g[0]+=g[i];
d-=g[i]*i;
continue;
}
while(d>=i){
g[0]++;
d-=i;
}
}
cout<<g[0]<<endl;
}
}
y总思路: 定义一个t来接受min(x,d/i) x表示当前输入的数 i表示数的下标 之后再让res+=t ;d-=t*i 思路简单明确(tql)
#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);
res += t;
d -= i * t;
}
}
cout << res << endl;
}
return 0;
}