Educational Codeforces Round 50 (Rated for Div. 2) D. Vasya and Arrays

看得我束手无策,刚开始读的时候还记得是连续的元素处理,但是后来想着想着变了,自己开始无序处理元素了,就不会做了。后来看题解才发现是道简单的贪心。先把两个序列所有元素分别加和,如果不等直接输出-1结束;相等的话,就从第一位不相等的元素开始,作为部分和,比较大小,小的就加自己序列的后一个元素,继续比较大小,直到相等,开始下一次匹配;每次匹配都会使答案+1;直到下标超出两个序列其中之一的边界时,结束,输出答案。

我被坑了以下几个地方:

1. 对应参数打错了,不对应了。

2. int型数据连续加和太多次,就超范围了,必须用long long型。

3. 忘了ios::sync_with_stdio(false)和cin.tie(0)的优化。

4. 最后,数据范围看错了,我开了十万的数组,但是目标数据范围是三十万的。

代码如下,极类标准题解。

#include <bits/stdc++.h>
#define N 300005
using namespace std;
typedef long long ll;
int a[N],b[N];
int main()  {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    ll suma=0,sumb=0;
    cin>>n;
    for (int i=0;i<n;i++)   {
        cin>>a[i];
        suma+=a[i];
    }
    cin>>m;
    for (int j=0;j<m;j++)   {
        cin>>b[j];
        sumb+=b[j];
    }
    if (suma!=sumb) {
        cout<<-1<<endl;
        return 0;
    }
    int posa=0,posb=0,ans=0;
    while (posa<n&&posb<m)  {
        ans++;
        ll sa=a[posa++],sb=b[posb++];
        while (sa!=sb)  {
            if (sa<sb)  sa+=a[posa++];
            else    sb+=b[posb++];
        }
    }
    cout<<ans<<endl;
    return 0;
}
posted @ 2018-09-10 21:24  CF过2100就买ARCTERYX  阅读(336)  评论(0编辑  收藏  举报