走方格

解题思路
这道题我们分析一下:将数据去掉一个点后奇偶分别求和,判断是否想等。
关于求和,你想到了什么?是不是前缀和?
我们可以分奇偶做前缀和,就像这样:
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[on]−c[i]b[i-1]+c[on]-c[i]b[i−1]+c[on]−c[i] | c[i−2]+b[jn]−b[i−1]c[i-2]+b[jn]-b[i-1]c[i−2]+b[jn]−b[i−1] |
其实,这样的话你只有0分,没想到吧啊哈哈哈哈。
对于当前点,奇数点和偶数点的情况是不一样的,所以应该是这样子的:
| 奇数总和 | 偶数总和 | |
|---|---|---|
| 奇数点 | b[i−2]+c[on]−c[i−1]b[i-2]+c[on]-c[i-1]b[i−2]+c[on]−c[i−1] | c[i−1]+b[jn]−b[i]c[i-1]+b[jn]-b[i]c[i−1]+b[jn]−b[i] |
| 偶数点 | b[i−1]+c[on]−c[i]b[i-1]+c[on]-c[i]b[i−1]+c[on]−c[i] | c[i−2]+b[jn]−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;
}
本文详细解析了一种称为“走方格”的算法问题。通过使用前缀和技巧,该文阐述了如何有效地计算去除某个点后剩余奇数点和偶数点的总和,并给出了完整的C++代码实现。
5万+

被折叠的 条评论
为什么被折叠?



