本文主要是介绍【SSL_2020.10.26】走方格,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
走方格
解题思路
这道题我们分析一下:将数据去掉一个点后奇偶分别求和,判断是否想等。
关于求和,你想到了什么?是不是前缀和?
我们可以分奇偶做前缀和,就像这样:
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;elsejn=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;
}
这篇关于【SSL_2020.10.26】走方格的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!