Codeforces-33C. Wonderful Randomized Sum

传送门

N个数,允许将前连续任意个数变化为其相反数,也允许把后连续任意个数变为相反数,求最大和

令dp[i][0]前i个数操作后能得到的最大值,dp[i][1]出去前i-1个数操作后能得到的最大值

注意初始化,不然对于答案为无需操作的情况会出错

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;

const int maxn = 1e5 + 10;
int A[maxn];
int dp[maxn][2];
int sum[maxn];

int N;

int main() {
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) {
        scanf("%d", &A[i]);
        sum[i] = sum[i - 1] + A[i];
    }
    int tmp = -INF;
    for (int i = 1; i <= N; i++) {
        tmp = max(tmp, -2 * sum[i]);
        dp[i][0] = sum[i] + tmp;
    }
    tmp = -INF;
    for (int i = N; i > 0; i--) {
        tmp = max(tmp, -2 * (sum[N] - sum[i - 1]));
        dp[i][1] = (sum[N] - sum[i - 1]) + tmp;
    }
    int ans = sum[N];//
    for (int i = 0; i <= N; i++) {
        ans = max(ans, dp[i][0] + dp[i + 1][1]);
    }
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/xFANx/p/8448187.html

时间: 2024-11-14 12:45:04

Codeforces-33C. Wonderful Randomized Sum的相关文章

CF33C Wonderful Randomized Sum 题解

原题链接 简要题意: 你可以无限次的把该数组的一个前缀和后缀 \(\times -1\),问最终的最大序列和. 这题盲目WA了数次才知道本质 这题89个数据吊打std CF真好啊,发现一个错后面就不测了 下面,就以我艰辛的思维历程来构造本篇博客. 算法一 盲猜:所有数都可以变成正数. 然后绝对值相加. 连样例也没测. 然后,\(\frac{2}{89} pts\). 只过了前两个样例,第三个就死了. #pragma GCC optimize(2) #include<bits/stdc++.h>

Codeforces 75D Big Maximum Sum 最大子段和 dp

题目链接:点击打开链接 题意: 第一行 n m n个vector 下面n行 第一个数字u表示vector 的大小,然后后面u个数字给出这个vector 最后一行m个数字 表示把上面的vector拼接起来 得到一个大序列,求这个大序列的最大子段和 先预处理出每个vector的最大子段和,左起连续最大,右起连续最大,所有数的和 然后dp 一下.. #include <cstdio> #include <iostream> #include <algorithm> #incl

codeforces 1242C/1243 E . Sum Balance

弄了一整晚 各种bug ...最后超时,差点放弃... 然后...没指望地 随意剪了个枝.,然后......居然做出来了... E. Sum Balance 题目大意:有k个箱子(1<=k<=15),在第i个箱子里有ni(1<=n<=5000)个整数 ( |aij|<=1e9).所有整数都是不同的.对 每个箱子 都  进行这样的操作:从每个箱子中取出一个整数,并放入 另一个或原本的 箱子中.问能否进行这样子的操作使得 操作结束后,每个箱子的数字的和相等. 赛后补题,看了cod

Educational Codeforces Round 5 E. Sum of Remainders (思维题)

题目链接:http://codeforces.com/problemset/problem/616/E 题意很简单就不说了. 因为n % x = n - n / x * x 所以答案就等于 n * m - (n/1*1 + n/2*2 ... n/m*m) 在根号n复杂度枚举x,注意一点当m>n时,后面一段加起来就等于0,就不用再枚举了. 中间一段x1 ~ x2 的n/x可能相等,所以相等的一段等差数列求和. 1 //#pragma comment(linker, "/STACK:1024

codeforces #319 B - Modulo Sum (抽屉原理,dp)

B - Modulo Sum Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description You are given a sequence of numbers a1, a2, ..., an, and a number m. Check if it is possible to choose a non-empty subsequence aij 

CodeForces - 1073E :Segment Sum (数位DP)

You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from l l to r r (including l l and r r ) such that each number contains at most k k different digits, and print this sum modulo 998244353 998244353 . For

【Codeforces 85 D】Sum of Medians

Codeforces 85 D 题意:维护一个有序集合,每次问编号\(mod\ 5\)余\(3\)的所有数的和. 思路:线段树维护\(mod\ 5\)余\(x\)的数的和,然后上推的时候根据左节点的值改一下就好了. Codeforces 718 A 题意:给一个小数,问最多取\(t\)次四舍五入到某一个小数点后的位后这个数最大能到多少. 思路:首先肯定贪心.(但不知道为什么tag上是\(dp\) 首先我们找到最靠左的一个大于等于5的数,把它四舍五入到上一位, 然后再不断地往前找到下一个大于等于5

Codeforces Round #599 E - Sum Balance

tarjan缩点,枚举子集. 首先avg即平均值是可以直接求出来的,我们假设第i个盒子给出去a,那么平衡需要的是,avg-sumi+a,我们把所有数字开一个map保存下来,如果有该数字,连一条有向边,从a到avg-sumi+a. 可以看到,因为题目说了unique ,所以一个点的出度是固定的,即1.现在要求所有盒子平衡,且每个盒子必须拿出来一个值.那么我们从a连出了一条有向边,如果这是一个可行解的话,那么a会处在一个环中,即a肯定也会被需要,而且还处在当前这条链中.因出度为1,环是简单环,是一条

【CodeForces 577B】Modulo Sum

题 题意 给你n(1 ≤ n ≤ 106)个数a1..an(0 ≤ ai ≤ 109),再给你m( 2 ≤ m ≤ 103)如果n个数的子集的和可以整除m,则输出YES,否则NO. 分析 分两种情况: 当n>m时,s[i]表示前i张钱共多少钱,s[i]%m的取值为0到m-1,由抽屉原理可知,s[i]一定有重复的,假如重复的是s[l]和s[r],那么s[r]-s[l]也就是l+1到r这些钱加起来就是m 的倍数.故答案为YES. 当n≤m时,我们用dp[i][j]==1表示前i张钱可以得到对m取余为