当前位置: 首页 > news >正文

蓝桥杯备赛系列——倒计时50天!

蓝桥杯备赛系列

倒计时50天!

前缀和和差分

知识点

**前缀和数组:**假设原数组用a[i]表示,前缀和数组用sum[i]表示,那么sum[i]表示的是原数组前i项之和,注意一般用前缀和数组时,原数组a[i]的有效下标是从1开始的。式子如下,
s u m [ n ] = ∑ i = 1 n a [ i ] sum[n]=\sum_{i=1}^n a[i] sum[n]=i=1na[i]
**差分数组:**假设原数组用a[i]表示,差分数组用d[i]表示,那么d[i]表示的是a[i]和a[i-1]之差,注意一般用差分数组时,原数组a[i]的有效下标也是从1开始的。式子如下,
d [ n ] = a [ i ] − a [ i − 1 ] d[n]=a[i]-a[i-1] d[n]=a[i]a[i1]
接下来看一下前缀和和差分的模板题。

前缀和模板

题目描述

给定一个长度为 n n n的数组 a 1 , a 2 , . . . . a n . a_1,a_2,....a_n. a1,a2,....an.

接下来有 q q q次查询, 每次查询有两个参数 l , r l, r l,r.

对于每个询问, 请输出 a l + a l + 1 + . . . + a r . a_l+a_{l+1}+...+a_r. al+al+1+...+ar.

输入描述

第一行包含两个整数 n n n q q q.

第二行包含n个整数, 表示 a 1 , a 2 , . . . . a n . a_1,a_2,....a_n. a1,a2,....an.

接下来q行,每行包含两个整数 l和r.

1 ≤ n , q ≤ 1 0 5 1≤n,q≤10^5 1n,q105
− 1 0 9 ≤ a [ i ] ≤ 1 0 9 −10^9≤a[i]≤10^9 109a[i]109
1 ≤ l ≤ r ≤ n 1≤l≤r≤n 1lrn

输出描述

输出 q q q行,每行代表一次查询的结果.

样例输入

3 2
1 2 4
1 2
2 3

样例输出

3
6
题目分析

前缀和最经典的一个作用就是以O(1)的时间复杂度求区间和。

sum[l-1]=a[1]+a[2]+a[3]+…+a[l-1]

sum[r]=a[1]+a[2]+a[3]+…+a[l-1]+a[l]+…+a[r]

sum[r]-sum[l-1]=a[1]+a[2]+a[3]+…+a[l-1]+a[l]+…+a[r]-(a[1]+a[2]+a[3]+…+a[l-1])

​ =a[l]+a[l+1]+…+a[r]

所以区间[l,r]的和可以用sum[r]-sum[l-1]表示。

题目代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int q = scanner.nextInt();int a[] = new int[n+1];long sum[] = new long[n+1];for(int i = 1;i <= n;i++) a[i] = scanner.nextInt();for(int i = 1;i <= n;i++) sum[i] = sum[i-1] + a[i];while(q-- > 0) {int l = scanner.nextInt();int r = scanner.nextInt();System.out.println(sum[r]-sum[l-1]);}
}
}
二维前缀和模板

题目描述

给你一个 n 行 m 列的矩阵 A ,下标从1开始。

接下来有 q 次查询,每次查询输入 4 个参数 x 1 , y 1 , x 2 , y 2 x1 , y1 , x2 , y2 x1,y1,x2,y2

请输出以 ( x 1 , y 1 ) (x1, y1) (x1,y1)为左上角 ,$ (x2,y2)$ 为右下角的子矩阵的和,

输入描述

第一行包含三个整数n,m,q.

接下来n行,每行m个整数,代表矩阵的元素

接下来q行,每行4个整数 x 1 , y 1 , x 2 , y 2 x1, y1, x2, y2 x1,y1,x2,y2,分别代表这次查询的参数

1 ≤ n , m ≤ 1000 1≤n,m≤1000 1n,m1000
1 ≤ q ≤ 1 0 5 1≤q≤10^5 1q105
− 1 0 9 ≤ a [ i ] [ j ] ≤ 1 0 9 −10^9≤a[i][j]≤10^9 109a[i][j]109
1 ≤ x 1 ≤ x 2 ≤ n 1≤x1≤x2≤n 1x1x2n
1 ≤ y 1 ≤ y 2 ≤ m 1≤y1≤y2≤m 1y1y2m

输出描述

输出q行,每行表示查询结果。

样例输入

3 4 3
1 2 3 4
3 2 1 0
1 5 7 8
1 1 2 2
1 1 3 3
1 2 3 4

样例输出

8
25
32
题目分析

我们通过图片分析如何求二维前缀和数组以及如何利用二维前缀和数组求矩阵和。

如何求二维前缀和数组。如图所示,假设要求 s u m [ x 1 ] [ y 1 ] sum[x1][y1] sum[x1][y1]的值,也就是图中大红色圈起来的部分,我们可以将蓝色部分加上绿色部分后再加上x1,y1处本来的值,也就是 s u m [ x 1 ] [ y 1 − 1 ] + s u m [ x 1 − 1 ] [ y 1 ] + a [ x 1 ] [ y 1 ] sum[x1][y1-1]+sum[x1-1][y1]+a[x1][y1] sum[x1][y11]+sum[x11][y1]+a[x1][y1]。但是这样会多加上一部分,也就是蓝色和绿色重叠的部分,他用 s u m [ x 1 − 1 ] [ y 1 − 1 ] sum[x1-1][y1-1] sum[x11][y11]表示,需要减掉。综上 s u m [ x 1 ] [ y 1 ] = s u m [ x 1 ] [ y 1 − 1 ] + s u m [ x 1 − 1 ] [ y 1 ] + a [ x 1 ] [ y 1 ] − s u m [ x 1 − 1 ] [ y 1 − 1 ] sum[x1][y1]=sum[x1][y1-1]+sum[x1-1][y1]+a[x1][y1]-sum[x1-1][y1-1] sum[x1][y1]=sum[x1][y11]+sum[x11][y1]+a[x1][y1]sum[x11][y11]

如何利用二维前缀和数组求矩阵和。如图所示,假设要求左上角下标为x1,y1,右下角下标为x2,y2的矩阵的值,也就是图中蓝色的部分。可以用 s u m [ x 2 ] [ y 2 ] − s u m [ x 2 ] [ y 1 − 1 ] − s u m [ x 1 − 1 ] [ y 2 ] + s u m [ x 1 − 1 ] [ y 1 − 1 ] sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1] sum[x2][y2]sum[x2][y11]sum[x11][y2]+sum[x11][y11]表示,也就是图中绿色部分减去图中橙色和紫色部分,而紫色和橙色部分有重叠,多减了,要再加回来,也就是图中棕色部分。

题目代码

代码细节,数据的读入涉及到矩阵,对于java而言数据量较大,要使用快读。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {
public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] strings = br.readLine().split(" ");int n = Integer.parseInt(strings[0]);int m = Integer.parseInt(strings[1]);int q = Integer.parseInt(strings[2]);long a[][] = new long[n+1][m+1];long sum[][] = new long[n+1][m+1];for(int i = 1;i <= n;i++) {strings = br.readLine().split(" ");for(int j = 1;j <= m;j++) {a[i][j] = Integer.parseInt(strings[j-1]);}}for(int i = 1;i <= n;i++) {for(int j = 1;j <= m;j++) {sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];}}while(q-- > 0) {strings = br.readLine().split(" ");int x1 = Integer.parseInt(strings[0]);int y1 = Integer.parseInt(strings[1]);int x2 = Integer.parseInt(strings[2]);int y2 = Integer.parseInt(strings[3]);System.out.println(sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]);}
}
}
差分模板题

题目描述

给你一个长度为n的正数数组 a 1 , a 2 , . . . . a n a_1,a_2,....a_n a1,a2,....an

接下来对这个数组进行m次操作,每个操作包含三个参数l,r,k,代表将数组中 a l + a l + 1 + . . . + a r a_l+a_{l+1}+...+a_r al+al+1+...+ar部分都加上k。

请输出操作后的数组。

输入描述

第一行包含两个整数n和m。
第二行包含n个整数表示 a 1 , a 2 , . . . . a n a_1,a_2,....a_n a1,a2,....an
接下来是m行,每行三个整数,分别代表每次操作的参数l,r,k.

1 ≤ n , m ≤ 1 0 5 1≤n,m≤10^5 1n,m105
− 1 0 9 ≤ a [ i ] ≤ 1 0 9 −10^9≤a[i]≤10^9 109a[i]109
1 ≤ l ≤ r ≤ n 1≤l≤r≤n 1lrn
− 1 0 9 ≤ k ≤ 1 0 9 −10^9≤k≤10^9 109k109

输出描述

输出1行,表示m次操作后的 a 1 , a 2 , . . . . a n a_1,a_2,....a_n a1,a2,....an

输入样例

3 2
1 2 3
1 2 4
3 3 -2

输出样例

5 6 1
题目分析

差分数组一般要结合前缀和使用,使用方法如下,

假设我有两个操作,第一个操作是对下标为3一直到下标为10的数字都加上2,第二个操作是对下标为4到下标为7的数字都加上3,朴素的做法是遍历一遍要操作的数组区间,然后执行操作就可以了,两次操作过后,原始数组累计要改变的值如下,

a的下标1234567891011
a要加上的值00255552220

这样做执行每次操作的时间复杂度是数组的长度。那么如何利用差分数组来做呢?

对下标为3一直到下标为10的数字都加上2——>d[3]+=2,d[11]-=2。

对下标为4到下标为7的数字都加上3——>d[4]+=3,d[8]-=3。

然后求d数组的前缀和数组,结果如下,下标从1开始

sum的下标1234567891011
sum的值00255552220

此时sum里面的值表示的是原始数组要变动的值,将sum数组与原始数组相加,即是操作后的结果,可以发现是和表1一样的。而这样每次操作的时间复杂度是O(1)。

综上,如果我要对区间[l,r]里的数加上k,我只需要对差分数组进行操作,即d[l]+=k,d[r+1]-=k。

题目代码
import java.util.Scanner;public class Main {
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();long[] a = new long[n+1];long[] s = new long[n+1];for (int i = 1; i < a.length; i++) {a[i] = scanner.nextInt();}while(m>0) {m--;int l = scanner.nextInt();int r = scanner.nextInt();int k = scanner.nextInt();s[l] += k;if(r+1<=n) {s[r+1]-=k;}}long sum[] = new long[n+1];for (int i = 1; i < s.length; i++) {sum[i] = sum[i-1]+s[i];a[i] = a[i]+sum[i];System.out.print(a[i] +" ");}
}
}
二维差分模板题

题目描述

给你一个n行m列的矩阵,下标从1开始。
接下来有q次操作,每次操作输入5个参数x1, y1, x2, y2, k
表示把以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的每个元素都加上k,
请输出操作后的矩阵。

输入描述

第一行包含三个整数n,m,q.
接下来n行,每行m个整数,代表矩阵的元素

接下来q行,每行5个整数x1, y1, x2, y2, k,分别代表这次操作的参数

1 ≤ n , m ≤ 1000 1≤n,m≤1000 1n,m1000
1 ≤ q ≤ 1 0 5 1≤q≤10^5 1q105
1 ≤ x 1 ≤ x 2 ≤ n 1≤x1≤x2≤n 1x1x2n
1 ≤ y 1 ≤ y 2 ≤ m 1≤y1≤y2≤m 1y1y2m
− 1 0 9 ≤ 矩阵中的元素 ≤ 1 0 9 −10^9≤矩阵中的元素≤10^9 109矩阵中的元素109

输出描述

输出n行,每行m个数,每个数用空格分开,表示这个矩阵。

样例输入

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

样例输出

9 8 6
8 7 5
题目分析

二维差分模板关键在于确定好在差分数组的哪些地方更改值。假设要更改的地方是从下标(2,4)到下标(3,6)的位置加1,那么首先必然是让(2,4)的位置加1,这样之后对差分数组求前缀和的结果如图所示,

我们要更改的是绿色圈起来的部分,但是之外的部分也更改了,我需要把这部分更改变回来,我想让(2,6)之后的从(2,7)开始都是0,既然(2,4)加了1,那么对应的(2,7)这一部分之后我要减掉1,来抵消前面的加1。同样,(4,4)也要减1来抵消(2,4)的加1。这样就可以了吗?这样相当于有两个位置减1,一个位置加1,一看也不对呀,对于(4,7)这个位置应该是没有变化的,但是它的前缀和所包含的格子里(2,4)加了1,(2,7)减了1,(4,4)也减了1,相当于(4,7)这个位置减了1,我们要把这个减1抵消,所以要在(4,7)这里加1。

综上,对(x1,y2)到(x2,y2)的格子都进行加k操作,只需要(x1,y1)+=k,(x1,y2+1)-=k,(x2+1,y1)-=k,(x2+1,y2+1)+=k。

然后对差分数组求二维前缀和之后,把结果累加到原始数组上就可以了。

题目代码
import java.util.Scanner;
public class Main{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();int q = scanner.nextInt();long[][] a = new long[n + 1][m + 1];long[][] b = new long[n + 1][m + 1];long[][] sum = new long[n + 1][m + 1];for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {a[i][j] = scanner.nextLong();}}while ((q--) != 0) {int x1 = scanner.nextInt();int y1 = scanner.nextInt();int x2 = scanner.nextInt();int y2 = scanner.nextInt();int k = scanner.nextInt();b[x1][y1] += k;if (y2 + 1 <= m) {b[x1][y2 + 1] -= k;}if (x2 + 1 <= n) {b[x2 + 1][y1] -= k;}if (x2 + 1 <= n && y2 + 1 <= m) {b[x2 + 1][y2 + 1] += k;}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+b[i][j];a[i][j] += sum[i][j];System.out.print(a[i][j] + " ");}System.out.println();}}
}
abb

题目描述

leafee 最近爱上了 abb 型语句,比如“叠词词”、“恶心心”

leafee 拿到了一个只含有小写字母的字符串,她想知道有多少个 “abb” 型的子序列?
定义: abb 型字符串满足以下条件:

  1. 字符串长度为 3 。
  2. 字符串后两位相同。
  3. 字符串前两位不同。

输入描述

第一行一个正整数 n

第二行一个长度为 n 的字符串(只包含小写字母)

1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105

输出描述

“abb” 型的子序列个数。

样例输入

6
abcbcc

样例输出

8

共有1个abb,3个acc,4个bcc

题目分析

在abcbcc中,acc的个数为3,他是哪3个呢?可以看下图,a的后面有3个c,在这3个c里面任选两个c可以和a组成一个叠词,那么组合的种类为 C 3 2 C_3^2 C32也就是 3 ∗ 2 / 2 = 3 3*2/2=3 32/2=3种。假设字母a后面有num个相同的字母,那么它能够贡献的叠词个数为 C n u m 2 C_{num}^2 Cnum2,也就是 n u m ∗ ( n u m − 1 ) / 2 num*(num-1)/2 num(num1)/2个。因此我们需要求出每个字母后面出现的其它相同字母的个数。

在这里插入图片描述

对于上图字符串,因为求的是后面的字符出现的次数,所以我们倒序遍历去求。位置6c出现了一次,用 n u m [ 6 ] [ c ] = 1 num[6][c]=1 num[6][c]=1表示,位置5c出现了1次,用 n u m [ 5 ] [ c ] = 1 num[5][c]=1 num[5][c]=1表示,位置3c出现了一次,用 n u m [ 3 ] [ c ] = 1 num[3][c]=1 num[3][c]=1表示,其余位置 n u m [ 1 , 2 , 4 ] [ c ] = 1 num[1,2,4][c]=1 num[1,2,4][c]=1都是0。那么求位置4后面包括位置4在内c出现的次数,应该是位置6的c累加上位置5的c,即 n u m [ 5 ] [ c ] + n u m [ 6 ] [ c ] num[5][c]+num[6][c] num[5][c]+num[6][c],求位置1后面c出现的次数,应该是 n u m [ 2 ] [ c ] + n u m [ 3 ] [ c ] + n u m [ 4 ] [ c ] + n u m [ 5 ] [ c ] + n u m [ 6 ] [ c ] = 0 + 1 + 0 + 1 + 1 = 3 num[2][c]+num[3][c]+num[4][c]+num[5][c]+num[6][c]=0+1+0+1+1=3 num[2][c]+num[3][c]+num[4][c]+num[5][c]+num[6][c]=0+1+0+1+1=3。这里其实就是前缀和数组或者说是后缀和数组,因为求的是后面的值累加的结果。

综上,我们用 n u m s [ i ] [ c ] nums[i][c] nums[i][c]表示下标为i的位置的右边字符c出现的总次数。这里的数组就是后缀和数组。即 n u m s [ i ] [ c ] = n u m [ i + 1 ] [ c ] + n u m [ i + 2 ] [ c ] + . . . + n u m [ n ] [ c ] nums[i][c]=num[i+1][c]+num[i+2][c]+...+num[n][c] nums[i][c]=num[i+1][c]+num[i+2][c]+...+num[n][c]

那么 n u m s [ i ] [ c ] = n u m s [ i + 1 ] [ c ] + n u m [ i ] [ c ] nums[i][c]=nums[i+1][c]+num[i][c] nums[i][c]=nums[i+1][c]+num[i][c]

题目代码
import java.util.Scanner;
public class abb {
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();char[] s = (" "+scanner.next()).toCharArray();int pre[][] = new int[n+2][26];for(int i = n;i >= 1;i--) {for(int j = 0;j < 26;j++) {//求下标为i的位置包括下标i在内26个字母中,每个字母出现的次数。这里要用到前缀和pre[i][j] =pre[i+1][j];}pre[i][s[i]-'a']++;//这里就是加上位置i的字母}long sum = 0;for(int i = 1;i <= n;i++) {for(int j = 0;j < 26;j++) {//注意这里要有j!=s[i]-'a'的判断,因为aaa是不合法的//同样也要有pre[i][j]>=2的判断,因为后面至少要有两个才能组合出acc//pre[i+1][j]是i+1,因为pre[i][j]包含了位置i的字母,但是我们求的是i后面的字母//但其实用pre[i][j]也没有问题,因为这里的字母j肯定和位置i的字母不一样,那么必然不会对pre[i][j]数组产生作用,因为这里的num[i][j]=0if(pre[i][j]>=2&&j!=s[i]-'a') sum += (pre[i+1][j]-1)*pre[i
+1][j]/2;}}System.out.println(sum);
}
}
鼠鼠我鸭

题目描述

在一个叫做酱西功爷枝叶鸡树学院的地方有n只小动物,要么是鼠鼠,要么是鸭鸭,从1到n编号,每只小动物有个体重 a i a_i ai

在这个学校里,存在一种神奇的魔法,可以将编号位于某个区间 [ l , r ] [l,r] [l,r]内的所有鼠鼠都变为鸭鸭,鸭鸭都变为鼠鼠(魔法并不会改变体重)。

现在你可以施放这个魔法至多1次。(也可以不施放)

问最终鸭鸭的总重量最多是多少?

输入格式

第一行一个整数T表示样例个数。 ( 1 ≤ T ≤ 10 ) (1≤T≤10) (1T10)

对于每个样例:

第一行一个整数n表示小动物的个数。( 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105)

第二行 n n n个整数,表示第 i i i个小动物的类型。0表示鼠鼠,1表示鸭鸭。

第三行 n n n个整数,表示第 i i i个小动物的体重 a i a_i ai。( 1 ≤ a i ≤ 1 0 9 1≤a_i≤10^9 1ai109)

输出格式

对于每个样例一行一个整数表示答案。

样例输入

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

样例输出

6
16
题目分析

假设原本所有鸭鸭的重量是sum,操作后形成的偏移是fix,即经过至多1次操作后鸭鸭的总重量是sum+fix,这里的fix最小是0,因为如果操作后的fix是负数,会使得鸭鸭的总重量减少,倒不如不操作,直接是sum就可以了。

来看这个fix应该怎么求。以样例的第二组数据为例,如果操作区间是[0,4],那么每个位置对应的偏移量分别为2,-5,6,5。总的偏移量为2-5+6+5=8。如果操作区间是[1,2],总的偏移量为-5+6=1。其实要求某个区间的偏移量就是数组[2,-5,6,5]对应区间的区间和。这里的[2,-5,6,5]也叫做偏移量数组,因为对于位置i的值而言,如果他是鸭鸭,一次操作后就变为了鼠鼠,那么之前累加上的他的重量应该减去,所以偏移量就是负的该位置的重量也就是-a[i],如果他是鼠鼠,一次操作后就变为了鸭鸭,他的重量应该累加上,所以偏移量就是该位置的重量也就是a[i]。所以我们可以求一下偏移量数组的前缀和,然后利用前缀和求最大的偏移量区间和,也就是一开始说的fix,累加到原始的重量和sum里面就好。

假设偏移量的前缀和数组是pre[i],那么偏移量的区间和[l,r]就用pre[r]-pre[l-1],如果我们遍历l和r的话,双层嵌套for循环会超时,所以这里应该采用类似双指针的做法,假设固定了r,要想pre[r]-pre[l-1]最大,需要pre[l-1]是区间[1,l-1]里面最小的那个数,用mi表示,关键代码如下,

fix=0;mi=0;
for(int i=1;i<=n;i++)  {fix=max(fix,s[i]-mi);//i固定时,mi是下标比i小的数中的最小值mi=min(mi,s[i]);}

fix最小是0,所以初始化为0。这里的mi最小值也为0,mi为0时表示的是区间[1,i]的区间和,如果mi不为负数,说明s[i]-mi会变小,即比s[i]本身小,倒不如直接用s[i],s[i]表示的就是前i项之和,也是区间和。

题目代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int N=1e5+10;
ll g[N],w[N],s[N],p[N];
ll sum,fix,mi;int main(){int t;cin>>t;while(t--){int n;cin>>n;for(int i=1;i<=n;i++)cin>>g[i];for(int i=1;i<=n;i++)cin>>w[i];for(int i=1;i<=n;i++){s[i]=s[i-1]+(g[i] == 1 ? -1 : 1)*w[i]; //计算出施加魔法后的偏移值(鸭子重量),如果原来是1(鸭子)就要减去,原来是0(鼠)就加上}sum=0;for(int i=1;i<=n;i++) {sum+=w[i]*g[i];}fix=0,mi=0;for(int i=1;i<=n;i++){fix=max(fix,s[i]-mi);mi=min(mi,s[i]);}cout<<sum+fix<<'\n';}return 0;
}

代码有一个易错点,因为变量都是全局变量,所以sum,fix,e在每一组测试样例中都要重置为初始值。

import java.util.Scanner;
public class Main{static  int N=(int) (1e5+10);static long[] g=new long[N],w=new long[N],s=new long[N],p=new long[N];static long sum,fix,mi;
public static void main(String[] args) {int t;Scanner scanner = new Scanner(System.in);t = scanner.nextInt();while(t-- > 0){int n;n = scanner.nextInt();for(int i=1;i<=n;i++)g[i]=scanner.nextLong();for(int i=1;i<=n;i++)w[i]=scanner.nextLong();for(int i=1;i<=n;i++){s[i]=s[i-1]+(g[i] == 1 ? -1 : 1)*w[i]; //计算出施加魔法后的偏移值(鸭子重量),如果原来是1(鸭子)就要减去,原来是0(鼠)就加上}sum=0;for(int i=1;i<=n;i++) {sum+=w[i]*g[i];}fix=0;mi=0;for(int i=1;i<=n;i++)  //从第一个遍历到最后,计算出最大最小值{fix=Math.max(fix,s[i]-mi);mi=Math.min(mi,s[i]);}System.out.println(sum+fix);}}
}

如果题目分析有错误或者没有表达清楚的地方,欢迎在评论区里指出!

相关文章:

蓝桥杯备赛系列——倒计时50天!

蓝桥杯备赛系列 倒计时50天&#xff01; 前缀和和差分 知识点 **前缀和数组&#xff1a;**假设原数组用a[i]表示&#xff0c;前缀和数组用sum[i]表示&#xff0c;那么sum[i]表示的是原数组前i项之和&#xff0c;注意一般用前缀和数组时&#xff0c;原数组a[i]的有效下标是从…...

jenkins配置ssh的时候测试连接出现Algorithm negotiation fail

背景&#xff1a;当jenkins升级后&#xff0c;同时ssh插件也升级&#xff0c;测试ssh连接的时候 出现的问题&#xff1a; com.jcraft.jsch.JSchAlgoNegoFailException: Algorithm negotiation fail: algorithmName"server_host_key" jschProposal"ecdsa-sha2-n…...

思维模型整合

思维模型整合 4P--- 4C思考模型能力圈模型 4P— 4C思考模型 在竞争激烈的今天&#xff0c;每个赛道都有众多可以为客户提供相同价值的对手&#xff0c;而赛道中的佼佼者之所以能打败大部分人&#xff0c;可能并不是他们能比别人更能讨好大众&#xff0c;而是因为在这个赛道它有…...

代理模式笔记

代理模式 代理模式代理模式的应用场景先理解什么是代理&#xff0c;再理解动静态举例举例所用代码 动静态的区别静态代理动态代理 动态代理的优点代理模式与装饰者模式的区别 代理模式 代理模式在设计模式中是7种结构型模式中的一种&#xff0c;而代理模式有分动态代理&#x…...

手机中有哪些逆向进化的功能

手机中有哪些逆向进化的功能&#xff1f;逆向进化是指明明很优秀的很方便的功能&#xff0c;却因为成本或者其他工业原因莫名其妙地给取消了。 逆向进化1&#xff1a;可拆卸电池-变为不可拆卸电池。 智能手机为了追求轻薄等原因&#xff0c;所以移除了可拆卸电池功能。将电池…...

LeetCode24.两两交换链表中的节点

参考链接&#xff1a;代码随想录&#xff1a;LeetCode24.两两交换链表中的节点 我这里使用了3个变量进行暴力交换&#xff0c;简单快捷&#xff01;但是有一点想不明白&#xff0c;return这里只能写dh->next,写返回head就结果不对了&#xff01;但是后面又想明白了&#xff…...

Eureka注册中心(黑马学习笔记)

Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 大家思考几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f; 有多个user-service实例地址&#xff0c…...

unity-firebase-Analytics分析库对接后数据不显示原因,及最终解决方法

自己记录一下unity对接了 FirebaseAnalytics.unitypackage&#xff08;基于 firebase_unity_sdk_10.3.0 版本&#xff09; 库后&#xff0c;数据不显示的原因及最终显示解决方法&#xff1a; 1. 代码问题&#xff08;有可能是代码写的问题&#xff0c;正确的代码如下&#xff…...

JWT(JSON Web Token)原理、应用与安全性分析

随着互联网的快速发展&#xff0c;Web应用的安全性越来越受到重视。在众多的安全认证技术中&#xff0c;JSON Web Token&#xff08;JWT&#xff09;凭借其简洁、自包含和传输安全的特点&#xff0c;被广泛应用于Web应用的用户身份验证和信息交换。 一、JWT的原理 JWT是一个开…...

Redis 缓存(Cache)

什么是缓存 缓存(cache)是计算机中的一个经典的概念在很多场景中都会涉及到。 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方&#xff0c;方便随时读取。 这里所说的“触手可及”是个相对的概念 我们知道&#xff0c;对于硬件的访问速度来说&#xff0c;通常…...

ChatGPT回答模式

你发现了吗&#xff0c;ChatGPT的回答总是遵循这些类型方式。 目录 1.解释模式 2.类比模式 3.列举模式 4.限制模式 5.转换模式 6.增改模式 7.对比模式 8.翻译模式 9.模拟模式 10.推理模式 1.解释模式 ChatGPT 在回答问题或提供信息时&#xff0c;不仅仅给出…...

戏曲文化苑|戏曲文化苑小程序|基于微信小程序的戏曲文化苑系统设计与实现(源码+数据库+文档)

戏曲文化苑小程序目录 目录 基于微信小程序的戏曲文化苑系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;戏曲管理 &#xff08;2&#xff09;公告信息管理 &#xff08;3&#xff09;公告类型管理…...

Mysql数据库主从集群从库Slave因为RelayLog过多过大引起服务器硬盘爆满生产事故实战解决

Mysql数据库主从集群从库slave因为RelayLog过多过大引起从库服务器硬盘爆满生产事故实战解决 一、MySQL数据库主从集群概念 MySQL数据库主从集群是一种高可用性和读写分离的数据库架构&#xff0c;它基于MySQL的复制&#xff08;Replication&#xff09;技术来同步数据。在主…...

QT基本组件

四、基本组件 Designer 设计师&#xff08;重点&#xff09; Qt包含了一个Designer程序&#xff0c;用于通过可视化界面设计开发界面&#xff0c;保存文件格式为.ui&#xff08;界面文件&#xff09;。界面文件内部使用xml语法的标签式语言。 在Qt Creator中创建文件时&#xf…...

uniapp实现全局悬浮框

uniapp实现全局悬浮框(按钮,页面,图片自行设置) 可拖动 话不多说直接上干货 1,在components新建组件(省去了每个页面都要引用组件的麻烦) 2,实现代码 <template><view class"call-plate" :style"top: top px;left: left px;" touchmove&quo…...

C语言特殊函数

静态函数 背景知识&#xff1a;普通函数都是跨文件可见的&#xff0c;即在文件 a.c 中定义的函数可以在 b.c 中使用。 静态函数&#xff1a;只能在定义的文件内可见的函数&#xff0c;称为静态函数。 语法 staitc void f(void) // 在函数头前面增加关键字 static &#xff…...

全栈开发(TS,React,Vue, Java, 移动端flutter)接单

个人主页 https://hz.minicv.net/ 技术栈 前端&#xff1a;NextJS React VueJS 后端&#xff1a;NestJS Java 移动端&#xff1a;Flutter 其他&#xff1a;SpringCloud Redis Kafka Zookeeper 项目案例 微行简历&#xff08; TS 全栈项目&#xff0c;一个极简的简历管理平…...

vue3使用百度地图

前情提要&#xff1a; 本文vue采用vue3框架&#xff0c;使用百度地图通过组件vue-baidu-map-3x&#xff1a; 组件官网&#xff1a;地图容器 | vue-baidu-map-3x 使用百度地图需要 申请百度地图AK秘钥 步骤&#xff1a;1.进入百度地图开放平台 | 百度地图API SDK | 地图开…...

docker 安装达梦dm8 包含lincese

1.加载达梦数据库docker镜像 dm_v8.1.1.66_x86_rh7_64_ent.tar为申请的镜像文件。 docker load -i dm_v8.1.1.66_x86_rh7_64_ent.tar 查看镜像 docker images 创建达梦数据库容器 执行创建命令&#xff1a; docker run -d -p 30236:5236 --restartalways --name dm8_test…...

golang入门介绍-1

今天开始发布关于go语言入门到实战内容&#xff0c;各位小伙伴准备好。 go介绍 Go语言&#xff08;或 Golang&#xff09;起源于 2007 年&#xff0c;并在 2009 年正式对外发布。是由 Google 公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。 Go 是…...

273.【华为OD机试真题】园区参观路径(动态规划-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-园区参观路径二.解题思路三.题解代码Python题解…...

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(二)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…...

超市售货|超市售货管理小程序|基于微信小程序的超市售货管理系统设计与实现(源码+数据库+文档)

超市售货管理小程序目录 目录 基于微信小程序的超市售货管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;商品管理 &#xff08;2&#xff09;出入库管理 &#xff08;3&#xff09;公告管理 …...

流程图:理解、创建与优化的视觉工具

流程图&#xff1a;理解、创建与优化的视觉工具 引言 在日常生活和工作中&#xff0c;我们经常遇到需要描述一系列步骤或过程的情况。这些步骤可能是制作一杯咖啡、完成一个项目&#xff0c;或者是解决一个复杂的数学问题。流程图&#xff0c;作为一种强大的视觉工具&#xf…...

Java EE面试题解析(下)

21、 什么是Servlet&#xff1f;【掌握】 Servlet是使用Java Servlet应用程序接口&#xff08;API&#xff09;及相关类和方法的Java程序。所有的Servlet都必须要实现的核心接口是javax.servlet.servlet。每一个Servlet都必须要直接或者间接实现这个接口&#xff0c;或者继承j…...

从零开始手写mmo游戏从框架到爆炸(二十一)— 战斗系统二

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 上一章&#xff08;从零开始手写mmo游戏从框架到爆炸&#xff08;二十&#xff09;— 战斗系统一-CSDN博客&#xff09;我们只是完成了基本的战斗&#xff0c;速度属性并没有…...

强化学习入门(Matlab2021b)-创建环境【3】

目录 1 前言2 根据类模板创建自定义环境2.1 创建类模板2.2 Environment properties(环境特性)2.3 Required Functions(需要的环境方法)2.3.1 Constructor function(构造函数)2.3.2 reset function2.3.3 step function2.4 Optional Functions(可选的环境方法)2.5 Environment Vi…...

C++如何避免float误差?

C如何避免float误差&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; …...

深信服技术认证“SCCA-C”划重点:深信服超融合HCI

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08;S…...

Vue3路由元信息

路由元信息即定义路由时的meta信息 使用路由元信息定义页面在浏览器显示的标题 定义路由 const router createRouter({history:createWebHistory(import.meta.env.BASE_URL),routes:[{path:"/",component:()>import("/components/Login.vue"),meta:{…...