暴力的写法
会导致题目超时所以采用前缀和但是前缀和如果只靠一个数组表示会很绕
https://vjudge.net/contest/614523#problem/C
暴力代码(过不了)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int p =2e5+10;
int s1[p],s2[p], qq[p];
int main(){
int n, m,sum1, sum2, maths=0;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> qq[i];
}
for(int i = 1; i <= n; i++)
{
sum1 = 0;
sum2 = 0;
for(int j = 1; j <= n; j++)
{
if(i == j)continue;
else if(j > i && j % 2 == 0)
{
sum1 += qq[j];
}
else if(j > i && j % 2 == 1)
{
sum2+= qq[j];
}
else if(j < i && j % 2 == 1)
{
sum1 += qq[j];
}
else if(j < i && j % 2 == 0)
{
sum2 += qq[j];
}
}
if(sum1 == sum2)maths++;
}
cout << maths <<"\n";
return 0;
}
点击查看代码
#include <bits/stdc++.h>
using namespace std;
//*cin >> s1[1];
//for(int i = 2; i <= a; i++)
//{
//cin >> cnt[i];
//if(i % 2 == 1)
//{
//s1[i] += s1[i - 2] + cnt[i];
// }
//else s2[i] += s2[i - 2] + cnt[i];
//这种输入方法会很绕得后面脑子转过来不然就是错的
const int p = 2e5+10;//题目为2E5所以开一个范围为2E5的数组,开小了会被pass,交之前经历过了
int cnt[p], s1[p]={0}, s2[p]={0};//s1 存奇数 s2存偶数
int main()
{
int a, sum1 ,sum2, n = 1, m = 1, x , result = 0;// m 用来记录所有奇数位的数字之和
cin >> a;//n用来记录所有偶数位的数字之和
for(int i = 1; i <= a ; i++)
{
std::cin >> cnt[i];
if(i % 2 ==1)
{
s1[i] = s1[i - 2] + cnt[i];//运用前缀和的思想来算出拿走对应的数所对应的奇数和
m+=cnt[i];//m是所以奇数的和
}
else{
s2[i] = s2[i - 2] + cnt[i];//运用前缀和的思想来算出拿走对应的数所对应的偶数和
n+=cnt[i];//n是所以偶数的和
}
}
for(int i = 1; i <= a; i++)
{
sum1 = 0, sum2 = 0;//sum1 用来记录变换后的奇数和 sum2 用来记录变换后的偶数和
if(i % 2 == 0 )
{
sum1 = n + s1[i - 1] - s2[i];//变换后的奇数和 等于 偶数和减去变换前的偶数和加上变化后的奇数和
sum2 = m + s2[i - 2] - s1[i - 1]; //变换后的奇数和 等于 奇数和减去变换前的奇数和加上变化后的偶数和
}//为什么这样子呢因为中间抽走一个数后对于抽走前的数没有影响 但是对抽走后的数会 导致 奇数位变成偶数位 偶数位变成奇数位
if(i % 2 == 1)//例如 1 2 3 4 5 6 我们把 3 抽走以后 就变成了1 2 4 5 6 || 4 对应的变成了 3 号位 就是奇数位 5 对应变成了 4 号位 就是偶数位
{
sum1 = n + s1[i - 2] - s2[i - 1];//为什么sum1 s1[i - 2] 就是我对应变换前的奇数和 s2[i - 1]是我对应偶数位变换前的数字 s1 代替了 s2 的位置
sum2 = m + s2[i - 1] - s1[i];
}
if(sum1 == sum2)result++;
}
std::cout << result <<"\n";
return 0;
}