Codeforces Round #540 (Div. 3) B. Tanya and Candies 思维

40 篇文章 0 订阅

http://codeforces.com/contest/1118/problem/B

题意:

有n颗糖,每颗糖都有一个质量,拿出其中一颗糖,剩下的糖的奇数位置上的质量和 和 偶数位置上的质量和相等的有多少个

思路:

对于拿掉第i位数的话,第i位之前的奇偶性是不变的,第i位之后的奇偶性是和原来相反的,所以我们用前缀和,分别求出奇数位置上的前缀和和偶数位置上的前缀和,然后对于第i位拿掉了以后就是判断一下前i-1位的奇数前缀和加上后面偶数位的前缀和是否等于前i-1位的偶数前缀和加上后面奇数位置的前缀和。

参考了大佬的思路:https://blog.csdn.net/Charles_Zaqdt/article/details/87774079

#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#include<queue>
#include<algorithm>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int s[maxn];
int a[maxn],b[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    int j,k;
    // j 为偶数个数
    // k 为奇数个数
    a[0] = b[0] = 0;
    j = k = 0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&s[i]);
        if(i%2==0)  //偶数前缀和
        {
            j++;
            a[j] = a[j-1]+s[i];
        }
        else  //奇数前缀和
        {
            k++;
            b[k] = b[k-1]+s[i];
        }
    }
    int m = 0;
    for(int i=1;i<=n;i++)
    {
        int x = a[(i-1)/2]; // i 之前的偶数和
        int y = b[i/2];   // i 之前的奇数和
         //拿出第 i 颗糖,i 之后的偶数和变为奇数和,i 之后的奇数和变为偶数和
         // 因为去掉 i 后,i之后的数 奇偶性交换
        if(i%2==0)  
        {
            if(b[k]-y+x == a[j]-x-s[i]+y)
                m++;
        }
        else
        {
            if(b[k]-y-s[i]+x == a[j]-x+y)
                m++;
        }
    }
    printf("%d\n",m);
    return 0;
}

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值