[一天至少一题直到ICPC开赛002]解题:Theofanis' Nightmare(12/11)

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是正常的吗            

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章