Codeforces Round #540 B. Tanya and Candies

题目链接:点击进入

这道题我们只需要将给dad的糖果拿出,然后分成奇数位的糖果和偶数位的糖果,计算总总量是否相等。但是,这道题我们会受到运行时间限制,普通的方法,不行

#include <iostream>
#include <vector>
#include <tuple>

using namespace std;

int ncount = 0;

void func(vector<int> vec, int i) {
    int odd = 0, even = 0;
    vec.erase(vec.begin() + i);
    for (int k = 0; k < vec.size(); ++k) {
        if (k % 2)
            odd += vec[k];
        else
            even += vec[k];
    }
    if (odd == even)
        ++ncount;
}

int main()
{
    ios_base::sync_with_stdio(false);
    int n, a, temp;
    vector<int> vec;
    cin >> n;
    temp = n;
    while (temp--) {
        cin >> a;
        vec.push_back(a);
    }
    for (int i = 0; i < n; ++i) {
        func(vec, i);
    }
    cout << ncount;

    return 0;
}

 

因此,我们需要找到这样一个关系式

OSuf + EPre = ESuf + OPre

OSuf:被删位置后面,奇数位的数字和   ESuf:被删位置后,偶数位的数字和

 EPre:被删位置前面,原偶数位的数字变成奇数位的数字集合的和    OPre:被删位置前面,原偶数位的数字变成奇数位的数字集合的和

#include <iostream>
#include <vector>

//#define ll long long

using namespace std;

int main()
{
    int n, opre = 0, osuf = 0, epre = 0, esuf = 0;
    cin >> n;
    vector<int> vec(n);
    for (int i = 0; i < n; i++) {
        cin >> vec[i];
        if (i & 1)
            esuf += vec[i];
        else
            osuf += vec[i];
    }

    int ans = 0;
    for (int i = 0; i < n; ++i) {
        if (i & 1)
            esuf -= vec[i];
        else
            osuf -= vec[i];
        if (esuf + opre == osuf + epre)
            ++ans;
        if (i & 1)
            epre += vec[i];
        else
            opre += vec[i];
    }

    cout << ans;

    return 0;
}

 

posted @ 2019-02-22 23:03  Hk_Mayfly  阅读(154)  评论(0)    收藏  举报