CF1038Dスライム

羅区CF1038Dスライム

トピックポータル

問題の意味の翻訳

効果の件名:

n-はありN-スライムの割合はそれぞれ、唯一のスライムqwq(彼らはそれらを持っていた場合)、スライムはスライムが左毎回または右を飲み込むことができ、その後、スコアがマイナスTAになりますどのくらいのスライムのスコアを飲み込まれ、スライムは最大最後の残りの部分を尋ねました

入力フォーマット:

最初の行の整数N- N-

二行目は、N 、N-スライムを示す整数、分数を

出力フォーマット:

最大スコアは整数

### 题目大意:
有$n$只史莱姆qwq,每只史莱姆有一个分数,每次一只史莱姆可以吞掉左边的或者右边的史莱姆(要是有的话),然后ta的分数会减去被吞的史莱姆的分数,问最后剩下的史莱姆分数最大为多少

### 输入格式:
第一行一个整数$n$

第二行$n$个整数,表示史莱姆的分数

### 输出格式:
一个整数,即最大分数

タイトル説明

n個存在するn個の行のスライム。各スライムは、それに関連付けられた(おそらく負またはゼロ)の整数値を有します。

任意スライム(このスライムが存在すると仮定し、その左または右に最も近いスライム)その隣接スライムを食べることができます。

値xとスライム場合、xは値yとスライム食べるyは、食べスライムが消え、そしてX残りスライムの値が変更- YのX - Y

残された唯一の1スライムがあるまでスライムはお互いを食べるようになります。

最後のスライムの可能な最大値を検索します。

入力形式

入力の最初の行は、整数N含有Nを(1 \ルN \ル500,0001≤ N ≤500000)スライムの数を表します。

次の行は、N含有N整数a_iを* **私は(-10 ^ 9 \ルa_iを\ル10 ^9-109≤* I ≤109)a_iを、 iは iの値であり、iはスライムを-Thを。

出力フォーマット

最後のスライムの可能な最大値 - 整数のみを印刷します。

サンプル入力と出力

入力#1コピー

出力#1コピー

入力#2のコピー

出力#2のコピー

説明/ヒント

最初の例では、値44で最後のスライムを得ることの可能な方法は次のとおりです。

  • 第スライムが第スライムを食べ、行が今含まスライム2、-1、12、-1,1
  • 第スライムが第スライムを食べ、行は現在、スライム2、-22が含ま-2
  • 第スライムが第スライムを食べ、行は現在44を含んでいます

第2の例では、最初のスライムは、44の値で終了する権利にスライムを食べ続けることができます。

効果の件名:

列の数は、あなたが隣接の数を引くことができ、最後の数はどのくらいになった後、最終的な数が最大に減少させることができることを尋ねました。

ソリューション:

これは、問題を数学的に導出されます。

まず、分類について説明します。この問題は三つの主要な条件があります。

すべて正、全て負、正の数も陰性です。

のは、見てみましょう:

正と負の両方がある場合、我々は削減してきたがので、我々は、より小さなカットをさせ、負の数に正の数を引くが、絶対値が大きく、最終的に正の数を減算することにより、あなたは最大値を得ることができますすることができますマイナスが、絶対値が最終的な出力は答え、「損失なし」で、その場合、変更されていない正と負の両方があり、最終的な答えである必要があり、すべての絶対数とします

全体が正であれば、私達はちょうど推論によって検討し、それが最終的には大きな正の数を取得し、負、正のマイナスマイナスを生成しなければならないので、私たちは大きな少しでできるだけ多くを引きます。全体が負の場合同様に、それは大きなマイナスの小さなです。のであれば、全体の正の整数負、それが最終的な答えである必要があり、すべての絶対数に二回最小数の絶対値のすべての数字を引きます

なお、n個のコード:(文献決意= 1)

#include<cstdio>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int n;
int pos,neg;
ll sum,minn=1e9;
int main()
{
    scanf("%d",&n);
    if(n==1)
    {
        ll a;
        scanf("%lld",&a);
        printf("%lld",a);
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        ll a;
        scanf("%lld",&a);
        if(a>0)
            pos++;
        if(a<0)
            neg++;
        sum+=abs(a);
        minn=min(minn,abs(a));
    }
    if(pos>0 && neg>0)
        printf("%lld",sum);
    else
        printf("%lld",sum-minn*2);
    return 0;
}

おすすめ

転載: www.cnblogs.com/fusiwei/p/11353090.html