解题报告:
思路:越靠近第一个数的位置移动到第一个数代价最小。
模拟过程:
4 5
1 0 3 2
从下标为1的开始移,发现为0,无法移动。
从下标为2的开始移,有3个,但每次移动需要2,只能移动2个。变为3 0 1 2
无法移动了。答案就是3
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 100+10;
ll num[N];
void solve(){
ll n, d;
scanf("%lld%lld", &n, &d);
for(ll i=0; i<n; ++i){
scanf("%lld", num+i);
}
for(ll i=1; i<n; ++i){
num[0] += min(i*num[i], d)/i;
d -= i*num[i];
if(d <= 0)break;
}
printf("%lld\n", num[0]);
}
int main(){
ll t;
scanf("%lld", &t);
while(t--){
solve();
}
return 0;
}
baronLJ 发布了206 篇原创文章 · 获赞 9 · 访问量 1万+ 私信 关注