(3つの方法)1次元の接頭辞の合計を解く

題名

長さnの整数のシーケンスを入力します。

次に、m個のクエリを入力し、クエリごとにl、rのペアを入力します。

クエリごとに、元のシーケンスのl番目の数値からr番目の数値までの合計を出力します。

入力フォーマット

最初の行には、2つの整数nとmが含まれています。

2行目には、整数のシーケンスを表すn個の整数が含まれています。

次のm行、各行には、クエリの範囲を表す2つの整数lとrが含まれています。

出力フォーマット

合計m行で、各行はクエリ結果を出力します。

データ範囲

1≤l≤r≤n、
1≤n、m≤100000、
-1000≤シーケンス内の要素の値≤1000

入力サンプル:

5 3
2 1 3 6 4
1 2
1 3
2 4

サンプル出力:

3
6
10

方法1:暴力的な列挙

#include <iostream>
using namespace std;
const int N=100010;
int main()
{
    
    
    int s[N];
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
    
    
        cin>>s[i];
    }
    
    while(m--)
    {
    
    
        int l,r;
        int sum=0;
        cin>>l>>r;
        for(int i=l;i<=r;i++)
        {
    
    
            sum+=s[i];
        }
       cout<<sum<<endl;
        
    }
    return 0;
    
    
}

方法2:関数を蓄積する

累積関数には通常2つの用途があり、そのうちの1つは配列要素を累積するために使用されます。
使用法:累積(最初のポインター、最後のポインター、初期値の累積)
ヘッダーファイルは次のとおりです。#include <numeric>

#include <iostream>
#include<numeric>      //注意头文件
using namespace std;
const int N=100010;
int main()
{
    
    
    int s[N];
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
    
    
        cin>>s[i];       //输入序列
    }
    
    while(m--)
    {
    
    
        int l,r;
        cin>>l>>r;
        cout<<accumulate(s+l,s+r+1,0)<<endl;     //直接计算出数列在区间[l,r]的和
    }
    return 0;
    
}

方法3:プレフィックスとアルゴリズム

#include <iostream>
using namespace std;
const int N=100010;
int main()
{
    
    
    int s[N];
    int n,m;
    cin>>n>>m;
    s[0]=0;
    for(int i=1;i<=n;i++)
    {
    
    
        cin>>s[i];
        s[i]=s[i-1]+s[i];    //初始化前缀和数组s[]
    }
    
    while(m--)
    {
    
    
        int l,r;
        cin>>l>>r;
        cout<<s[r]-s[l-1]<<endl;    //利用前缀和算法计算区间[l,r]上的值
        
    }
    return 0;
    
    
}

おすすめ

転載: blog.csdn.net/qq_46009744/article/details/114233574