zoukankan      html  css  js  c++  java
  • C. Four Segments 前缀后缀

    C. Four Segments

    这种分成了三个节点一般都可以处理一下前缀处理一下后缀,或者处理一下前面的这个点,处理一下后面的这个点,然后再枚举中间这个点。

    如果和中间这个点有关的,那么就可以换一下顺序,先枚举中间这个点,然后处理前面和后面的点。

    这个是先枚举中间这个点,然后往前面贪心,往后面贪心。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <iostream>
    #include <map>
    #include <list>
    #define inf 0x3f3f3f3f
    #define inf64 0x3f3f3f3f3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int maxn = 5e3 + 10;
    ll sum[maxn], a[maxn];
    
    int main()
    {
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), sum[i] = sum[i - 1] + a[i];
        ll ans = 0, x = 1, y = 1, z = 1;
        for(int i=1;i<=n;i++)
        {
            ll res1 = 0, mark1 = 1;
            for (int j = i; j <= n + 1; j++) {
                ll num = sum[j - 1] * 2 - sum[i - 1] - sum[n];
                if (num > res1)    res1 = num, mark1 = j;
            }
            ll res2 = 0, mark2 = 1;
            for (int j = 1; j <= i; j++) {
                ll num = 2 * sum[j - 1] - sum[i - 1];
                if (num > res2) res2 = num, mark2 = j;
            }
            if(res1+res2>ans)
            {
                ans = res1 + res2;
                x = mark2, y = i, z = mark1;
                // printf("ans=%d
    ", ans);
            }
        }
        printf("%lld %lld %lld
    ", x - 1, y - 1, z - 1);
        return 0;
    }
    View Code
  • 相关阅读:
    团队项目的NABC(截图软件)
    《梦断代码》读后感_3
    《梦断代码》读后感_2
    毕设今日总结(二)
    毕业设计今日总结(一)
    QT中文乱码解决方法
    课堂练习——最大联通之数组
    《浪潮之巅》读书笔记3
    《浪潮之巅》读书笔记2
    《浪潮之巅》读书笔记1
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/11405160.html
Copyright © 2011-2022 走看看