【模拟?】Codeforces 1036 D.Vasya and Arrays

版权声明:转载标注来源喔~ https://blog.csdn.net/iroy33/article/details/90045162

题意:两个数组a,b,可以将任意一个区间变为一个数,值为该区间的和,问一波操作之后能否令a,b想等,能的话最长是多少

这个是我的代码,一开始T了,后来将sum不相等的情况提前退出就A了

大体思路是如果两个相等,就都保留(因为要求长度尽可能长,而且值一样的话对区间加和是否相等没有影响)

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const int N=3e5+10;
LL a[N],b[N];
LL newa[N],newb[N];
LL sum1=0,sum2=0;
int cnt1=0,cnt2=0;
int i=0,j=0;
int n,m;
int main()
{
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(newa,0,sizeof(newa));
    memset(newb,0,sizeof(newb));
    scanf("%d",&n);
    for(int i=0;i<n;++i) scanf("%lld",&a[i]),sum1+=a[i];
    scanf("%d",&m);
    for(int i=0;i<m;++i) scanf("%lld",&b[i]),sum2+=b[i];
    if(sum1!=sum2) {cout<<"-1"<<endl; return 0;}
    i=j=0;
    newa[cnt1]=a[i];
    newb[cnt2]=b[j];
    while(i<n&&j<m)
    {
        if(newa[cnt1]==newb[cnt2])
        {
            cnt1++; cnt2++;
            i++;    j++;
            newa[cnt1]=a[i]; newb[cnt2]=b[j];       //开启新一轮的比较
            continue;
        }
        if(newa[cnt1]<newb[cnt2])
        {
            while(i<n&&newa[cnt1]<newb[cnt2])
            {
                i++; newa[cnt1]+=a[i];
            }
            if(newa[cnt1]==newb[cnt2])
            {
                cnt1++; cnt2++;
                i++;    j++;
                newa[cnt1]=a[i]; newb[cnt2]=b[j];
            }
            else if(i==n) {cout<<-1<<endl; return 0;}   //找到头了也不相等
            continue;
        }
        if(newb[cnt2]<newa[cnt1])
        {
                while(j<m&&newb[cnt2]<newa[cnt1])
                {
                    j++;    newb[cnt2]+=b[j];
                }
                if(newa[cnt1]==newb[cnt2])
                {
                    cnt1++; cnt2++;
                    i++;    j++;
                    newa[cnt1]=a[i]; newb[cnt2]=b[j];
                }
                else if(j==m) {cout<<-1<<endl; return 0;}
                continue;
        }
    }
    if(cnt1==cnt2&&i==n&&j==m&&newa[cnt1-1]==newb[cnt2-1]&&newa[cnt1-1])
        cout<<cnt1<<endl;
    else cout<<-1<<endl;
}

然后我看了题解_(:з」∠)_ 我上面居然能A我也是很感动了。。

造成我代码复杂乱七八糟的原因是:我忽略了一个结论!只要两个数组的和相等,那么一定能变得一样,最直接的方法就是数组全部加起来,不过这个是最短的!因此我只要找出能凑成几个区间,a,b和相等就结束了。思路还是贪心。

(我怕不是脑子被吃掉了呜呜)

大佬博客

#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;
}

猜你喜欢

转载自blog.csdn.net/iroy33/article/details/90045162