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; }

浙公网安备 33010602011771号