题目描述
有n堆石头排成一排,标号为0到n-1,第i堆石头有a[i]个石头
每一步你可以从某一堆取一个石头放到相邻的石头堆里
请问需要多少步可以将a数组变成b数组
每一步你可以从某一堆取一个石头放到相邻的石头堆里
请问需要多少步可以将a数组变成b数组
输入描述:
第一行先输入一个整数n (1 ≤ n ≤ 50) 第二行输入n个数ai 第三行输入n个数bi 0 ≤ ai, bi ≤ 106
输出描述:
输出一个整数表示最少的操作步数,如果无法将a数组变成b数组,输出-1
备注:
子任务1:n <= 10 子任务2:n <= 20 子任务3:无限制
代码如下:
#include<stdio.h>
#include<math.h>
int a[1000020],b[1000020];
int main(){
long long int ans=0;
int n,i,sum;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
for(i=0;i<n;i++) scanf("%d",&b[i]);
for(i=0;i<n;i++){
if(i==n-1){
if(a[i]!=b[i]){
printf("-1\n");
return 0;
}
}
sum=a[i]-b[i];
ans+=abs(sum);
a[i]-=sum;
a[i+1]+=sum;
}
printf("%lld\n",ans);
return 0;
}
#include<math.h>
int a[1000020],b[1000020];
int main(){
long long int ans=0;
int n,i,sum;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
for(i=0;i<n;i++) scanf("%d",&b[i]);
for(i=0;i<n;i++){
if(i==n-1){
if(a[i]!=b[i]){
printf("-1\n");
return 0;
}
}
sum=a[i]-b[i];
ans+=abs(sum);
a[i]-=sum;
a[i+1]+=sum;
}
printf("%lld\n",ans);
return 0;
}