1. 程式人生 > >1036D Vasya and Arrays (貪心)

1036D Vasya and Arrays (貪心)

 題意:有兩個長度為n和m的序列A和B,每次操作可以將序列連續的幾個數合併為1個,該數的值是那連續幾個數的和。現在進行若干次操作讓A和B相等,問操作形成的相等序列的最大長度是多少。

題解:從左向右掃,並記錄A和B序列的和sum1、sum2,每當和相等時,結果+1,sum1與sum2清0

#include<bits/stdc++.h>
#include<cstring>
using namespace std;
#define ll long long
ll a[300010],b[300010];
int main()
{
    int n;
    scanf("%d",&n);
    ll sum1=0;
    for(int i=1; i<=n; ++i)
    {
        scanf("%I64d",&a[i]);
        sum1+=a[i];
    }
    int m;
    scanf("%d",&m);
    ll sum2=0;
    for(int i=1; i<=m; ++i)
    {
        scanf("%I64d",&b[i]);
        sum2+=b[i];
    }
    if(sum1!=sum2)
        return puts("-1");
    int pos1=1,pos2=1;
    sum1=0;sum2=0;
    int ans=0;
    while(pos1<=n && pos2<=m)
    {
        if(sum1==sum2 && sum1>0)
        {
            ans++;
            sum1=0;
            sum2=0;
        }
        if(sum1>sum2)
            sum2+=b[pos2++];
        else //sum1<sum2
            sum1+=a[pos1++];
    }
    if(sum1 || sum2)
        ans++;
    printf("%d\n",ans);
    return 0;
}