トピックの概要:単一動作間隔、区間区間数の番号を割り当てられた金額を選択し、区間内の他の数字をクリアします。分析\(A \)配列になることができるかどうか\(B \)配列が出力された場合の動作の最小数。
悪い習慣:
ダブルポインタレコード今位置&&配列および\(B \)配列の位置、各時間\(B [I] \) 0に等しくない場合には、\(ANS ++ \) 、それ自体であれば[i]は、本質的に準拠します条件マイナスバック。プラスラインの残りの部分、増加は出力に十分でない場合は-1。
また、あなたは宣告合計が等しい開始する必要があります。
#include<queue>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxm=1e+7;
int t,n,ans;
int a[maxm],b[maxm];
int solve()
{
int r=1;
ll sum=0;
ans=0;
for(int i=1;i<=n;i++)
{
if(!b[i]) continue;
ans++;
int l=r;
sum=0;
while((sum<b[i])&&(r<=n)) sum+=a[r++];
if(sum!=b[i]){
return -1;
}
if(i>=l&&i<=r-1&&a[i]==b[i]) ans--;//;如果段只包含了自己并且位置相同,我们就不需要浪费操作在它身上
}
return ans;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ll sum1=0,sum2=0;
for(int i=1;i<=n;i++)
scanf("%d",a+i),sum1+=a[i];
for(int i=1;i<=n;i++)
scanf("%d",b+i),sum2+=b[i];
if(sum1!=sum2)//如果b[i]后面有连续的0,下面的就不能输出-1了
{
printf("-1\n");
continue;
}
printf("%d\n",solve());
}
return 0;
}