(Tres métodos) Resuelve la suma del prefijo unidimensional

Título

Introduzca una secuencia de números enteros de longitud n.

A continuación, ingrese m consultas e ingrese un par de l, r para cada consulta.

Para cada consulta, genere la suma desde el número 1 hasta el número 6 en la secuencia original.

Formato de entrada

La primera línea contiene dos números enteros n y m.

La segunda línea contiene n números enteros, que representan una secuencia de números enteros.

Las siguientes m líneas, cada línea contiene dos números enteros lyr, que representan el rango de una consulta.

Formato de salida

Un total de m líneas, cada línea genera un resultado de consulta.

rango de datos

1≤l≤r≤n,
1≤n, m≤100000,
−1000≤ El valor del elemento en la secuencia ≤1000

Muestra de entrada:

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

Salida de muestra:

3
6
10

Método 1: enumeración violenta

#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;
    
    
}

Método 2: función de acumulación

La función de acumulación generalmente tiene dos usos, uno de los cuales se usa para acumular elementos de matriz.
Uso: acumular (primer puntero, último puntero, acumular valor inicial) El
archivo de encabezado es: #include <numérico>

#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;
    
}

Método tres: prefijo y algoritmo

#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;
    
    
}

Supongo que te gusta

Origin blog.csdn.net/qq_46009744/article/details/114233574
Recomendado
Clasificación