走方格
解题思路
这道题我们分析一下:将数据去掉一个点后奇偶分别求和,判断是否想等。
关于求和,你想到了什么?是不是前缀和?
我们可以分奇偶做前缀和,就像这样:
for(int i=1;i<=n;i+=2)
b[i]=b[i-2]+a[i];
for(int i=2;i<=n;i+=2)
c[i]=c[i-2]+a[i];
然后就是程序的主体了,我们试着用式子表示出去掉当前点后奇数和偶数的总和:
奇数总和 | 偶数总和 |
---|---|
b [ i − 1 ] + c [ o n ] − c [ i ] b[i-1]+c[on]-c[i] b[i−1]+c[on]−c[i] | c [ i − 2 ] + b [ j n ] − b [ i − 1 ] c[i-2]+b[jn]-b[i-1] c[i−2]+b[jn]−b[i−1] |
其实,这样的话你只有0分,没想到吧啊哈哈哈哈。
对于当前点,奇数点和偶数点的情况是不一样的,所以应该是这样子的:
奇数总和 | 偶数总和 | |
---|---|---|
奇数点 | b [ i − 2 ] + c [ o n ] − c [ i − 1 ] b[i-2]+c[on]-c[i-1] b[i−2]+c[on]−c[i−1] | c [ i − 1 ] + b [ j n ] − b [ i ] c[i-1]+b[jn]-b[i] c[i−1]+b[jn]−b[i] |
偶数点 | b [ i − 1 ] + c [ o n ] − c [ i ] b[i-1]+c[on]-c[i] b[i−1]+c[on]−c[i] | c [ i − 2 ] + b [ j n ] − b [ i − 1 ] c[i-2]+b[jn]-b[i-1] c[i−2]+b[jn]−b[i−1] |
那么这个程序就很简单了:
code
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[200010];
int b[200010],c[200010];
int jn,on,ans
;
int main()
{
cin>>n;
if(n%2==0)
jn=n-1,on=n;
else
jn=n,on=n-1;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i+=2)
b[i]=b[i-2]+a[i];
for(int i=2;i<=n;i+=2)
c[i]=c[i-2]+a[i];
for(int i=1;i<=n;i++)
{
if(i%2==0)
{
if(b[i-1]+c[on]-c[i]==c[i-2]+b[jn]-b[i-1])
ans++;
}
else
{
if(b[i-2]+c[on]-c[i-1]==c[i-1]+b[jn]-b[i])
ans++;
}
}
cout<<ans<<endl;
}