版权声明:转载标注来源喔~ 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;
}