アルゴリズム:プレフィックスと使用

接頭辞を使用すると、二つのトピックには:

トピック1:nは個人が行であると仮定し、すべての人の知識の値が整数であり、そして今、私たちは、k個の連続人々を選択したい、それK個人の知識や最大値、あなたの出力の最大値作ります。

入力フォーマット
入力ライン2を含みます。

  • 最初の行は2つの整数を有し、N、K(1 <= K <= N <= 10 ^ 5)、連続番号と選択されたヒトの総数と
  • nはスペースで区切られた整数のTi(^ 9 1 <= TI <= 10)、各個人の知識の値の第2行

出力フォーマット
出力は、整数であり、kの最大値は、個々の値の連続的な知識であります

サンプル入力
。5. 3
。1. 3 1 2 2
サンプル出力
7

方法の一つ:接頭辞と

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
long long t[100005], s[100005], ss = -1;
int main() {
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> t[i];
        s[i] = s[i-1] + t[i];//s数组:前缀和
    }
    for(int i=k; i<=n; i++){//这里直接从k开始
        if(s[i] - s[i-k] > ss)
        	ss = s[i] - s[i-k];
	}
    cout << ss;
    return 0;
}

方法2:と接頭辞なし、ポインタの動きが純粋な列挙と同等の方法で達成することができます!

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
long long t[100005],ss = -1;
int main() {
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> t[i];
    }
    long long now = 0, ans = 0;
    for(int i=1; i<=n; i++){
        if(i <= k ){//now:连续k个数的和
            now += t[i];
		}else{
            now += t[i];
            now -= t[i-k];
		}
        if(i >= k){//ans:连续k个数的最大值
            ans = max(ans, now);
		}
	}
    cout << ans;
    return 0;
}

問題2:これは、左から右A1までのリボンによって知られているN個の異なる色が係合され、そして(正の整数を含む、ゼロまたは負の整数)の整数で表される各色の装飾効果が順次形成されており、挨拶カードを作成するために装飾的な最高の期間の色を選択するためのA2、A3、...、カードを挨拶飾るために使用される連続部分をカットし、そこから暁明は、装飾的な効果は、各色装飾効果の合計のこのセクションで、暁明の必要性(どちらか最大部の色値に)、もちろん、すべての色装飾効果のみ(すなわち、<0 AI)負の効果を持つことができる場合、ボブは装飾的なグリーティングカードを放棄もたらすことができる(装飾効果は、色を用いて得られる0 )。

入力フォーマット
の入力データが2行で構成されています。
最初の行は整数nは、リボンの色の数であり、第二行はA1、A2、A3、...、nは整数であったがあり (1 <= nが< = 1000)。

出力形式の
出力データは、装飾効果を得ることができるグリーティングカードの最大数を表す唯一の整数です。

サンプル入力
。5
-1 2 -1 2 -1
サンプル出力
3

方法の一つ:接頭辞と

#include<bits/stdc++.h>
using namespace std;
#define N 1005
int number[N], sum[N];
int main() {
    int n, mmax = -10001;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> number[i];
        sum[i] = sum[i-1] + number[i];
    }
    for(int i=1; i<=n; i++){
        for(int j=i; j<=n; j++){
            int result = sum[j] - sum[i-1];
            mmax = max(mmax, result);
		}
	}
    cout << mmax;
    return 0;
}

方法2:と接頭辞なし、ポインタの動きが純粋な列挙と同等の方法で達成することができます!

#include<bits/stdc++.h>
using namespace std;
#define N 1005
int a[N];
int main(){
    int n, ans = 0;
    cin >> n;
    for(int i=1; i<=n; i++)
        cin >> a[i];
	for(int i=1; i<=n; i++){//i:枚举的左端点
        int s = 0;
        for(int j=i; j<=n; j++){//j:枚举右端点
            s += a[j];//s:左右断点的和
            ans  = max(ans, s);
		}
	}
    cout << ans;
    return 0;
}
公開された15元の記事 ウォン称賛10 ビュー212

おすすめ

転載: blog.csdn.net/qq_39053800/article/details/104244458
おすすめ