Theofanis' Nightmare
题目连结
只要大于0就直接拆开,这就是贪心演算法
解题核心
本次用到贪心演算法
如果右边的值>0,那么他乘以越高位值(将阵列拆成越多块)得出的值也越大
相反,如果最左边的值<0,那么就将其跟次位相加至>0就可以开始
因为用乘的会RE,所以用加法的(原理相同)
a*3==a+a+a
利用这个原理==>只要从阵列后面加入且值大于>0就加入ans等同于1(加第二次就是2)
可以举下列例子:
1 2 3 -4 5
利用贪心
第一笔:5>0 ==>放入ans(目前:5)
第二笔:5+(-4)=1>0 ==>放入ans(5+1)
第三笔:1+3=4>0 ==>放入ans(4+6)
第四笔:4+2=6>0 ==>放入ans(10+6)
第五笔:6+1=7>0 ==>放入ans(16+7=23)
就等同于:
1(加一次)+2(加两次)*2+3(加三次)*3-4(加四次)*4+5(加五次)*5
1+2 *2 + 3*3- 4* 4+5*5=23
```cpp#include <iostream>#include <vector>#define ll long long int#define dasabi uintusing namespace std;/*//* 题目:Theofanis' Nightmare 题目连结:https://codeforces.com/contest/1903/problem/C 解题者:神里绫华的狗(dasabi7414) 使用语言:C++11 本次技巧:Greedy 解题连结:https://github.com/archie0732/c-solution/blob/main/codeforce/Theofanis'%20Nightmare.md 本文会放在IT帮忙//* 备注:本题是使用"贪心演算法"请先确保已经熟悉!!*/int main(int argc, char const *argv[]){ int t; cin >> t; while (t--) { int n; cin >> n; vector<int> v(n); for (int i = 0; i < n; i++) cin >> v[i]; // 这里一定要用long long(因为我被搞过XD) ll sum = 0; ll ans = 0; // 倒着回来加 for (int i = n - 1; i >= 0; i--) { // 如果相加大于0==>加入解答,反之==>继续加(至其倒阵列坐左边或sum>0) sum = v[i] + sum; if (sum > 0 || i == 0) { ans += sum; } } cout << ans << endl; } return 0;}// 总之,要先熟悉贪心演算法(Greedy),与多点的练习。// 用乘法可会一直RE是正常的吗