&&可以通俗的理解为数列前n项的和,或者可以理解为数组中前n项目之和。

https://oi-wiki.org/basic/prefix-sum/

<1>一维数组的前缀和,代码实现:

 import java .util.Scanner;
 public class Main{
public static void main(String[]args)
{
    Scanner input =new Scanner(System.in);
    int n= input.nextInt();
    int []ant=new int[1000];
    int []arr=new int[1000];
    for(int i=0;i<n;i++)
    {
        ant[i]= input.nextInt();
    }
    arr[0]=ant[0];
    for(int i=1;i<n;n++)
    {
        arr[i]=arr[i-1]+ant[i];
    }
    for(int i=0;i<n;i++)
    {
        System.out.print(arr[i]+" ");
    }

}
}

例题& 来源:牛客网

小沙非常好客,小沙有一家超市,超市里面有为 n 件商品,小沙有 Q 个问题,小沙想问问你,如果小沙想要让你挑选最多 k 个价值不大于 x 的商品,请问你能挑选的价值和最大为多少。

输入描述:

第一行输入两个整数1<=n<=10的5次方,1<=q<=10的5次方,代表商品个数以及询问次数

第二行输入n个数字代表商品价格序列a

随后q行

每行两个正整数k,x;

输出描述:

每次询问输出一行代表答案

例如

5 3

1 3 3 5 10

4 3

2 3

3 10

输出

7

6

18

<解题思路分析>

前缀和+二分

import java.util.*;

public class Main {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    
    int n = scanner.nextInt();
    long q = scanner.nextLong();
    long[] a = new long[n + 1];
    long[] b = new long[n + 1];
    for (int i = 1; i <= n; i++) {
        a[i] = scanner.nextLong();
    }
    Arrays.sort(a);
    for (int i = 1; i <= n ; i++) {
        b[i] = b[i - 1] + a[i];
    }
    for (long i = 0; i < q; i++) {
        long k = scanner.nextLong();
        long x = scanner.nextLong();
        long sum = 0;
        long temp=upperBound(a,x,n);
        if(temp>k) sum=b[(int)temp]-b[(int)(temp-k)];
        else sum=b[(int)temp];
       System.out.println(sum);
    }
    
}
public static long upperBound(long[] a,long x,long n){//二分法
    long l=1;long r=n;
    while (l<=r){
        long mid=(r+l)/2;
        if(a[(int)mid]<=x) l=mid+1;
        else r=mid-1;
    }
    return r;
}
}