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

蓝桥杯深秋的苹果

题目

当深秋的苹果树丰收时,村庄的居民们兴致勃勃地采摘着红彤彤的苹果。他们将采摘下来的 NN 个苹果排成了一排,形成了一个苹果序列 AA,第 ii 个苹果的甜度值为 AiAi​(1≤i≤N1≤i≤N)。

现在村民需要将苹果序列划分为连续的 MM 段,对于分割后的某一段 Al∼rAl∼r​,定义其美味值表示为该段内不同下标的苹果的甜度两两相乘的总和,即 ∑i=lr∑j=i+1rAi⋅Aj∑i=lr​∑j=i+1r​Ai​⋅Aj​。

注:如果某一段只有一个苹果,它的美味值为 00。

请问应当如何给苹果分段,才能使得美味值最大的一段尽可能小,你只需要输出这个最大美味值可能的最小值即可。

输入格式

第 11 行输入 22 个正整数 N,MN,M,分别为苹果序列的长度和需要分成的段数。

第 22 行输入 NN 个空格隔开的正整数,表示苹果序列。

输出格式

输出仅 11 行,包含 11 个整数,表示答案。

样例输入

6 3
1 4 7 2 5 8

样例输出

39

说明

我们可以把苹果序列分成 [1,4,7],[2,5],[8][1,4,7],[2,5],[8],这样最大的一段美味值为 3939,是最小的分法。

评测数据规模

1≤M≤N≤2000001≤M≤N≤200000。

1≤Ai≤100001≤Ai​≤10000。

解题思路

哦,这个问题看起来有点挑战性。我得仔细看看题目要求。题目是说,把N个苹果分成M段,每一段的美味值是该段内所有两两不同下标苹果的甜度乘积之和。然后,我们需要让所有段中的最大美味值尽可能的小,求这个最小的最大值。对吧?

那首先,我得想,怎么计算一段的美味值。比如,假设有一个段是l到r,那么这段的美味值是sum_{i=l到r} sum_{j=i+1到r} A[i]*A[j]。那这个怎么快速计算呢?因为直接两重循环的话,当数据量大的时候可能会超时。

我记得有一个数学公式可以将这个总和转化为更高效的计算方式。比如,假设总和的平方减去各元素的平方之和,然后除以2。或者说,这个总和等于(sum A[i])^2 - sum A[i]^2,然后除以2?因为,总和的平方等于每对两个元素的乘积的和加上各个元素的平方之和。所以,每对相乘的总和等于(sum^2 - sum各平方) / 2。这样对吗?例如,假设有a、b、c三个数,总和的平方是a² + b² + c² + 2ab + 2ac + 2bc。所以,所有两两的乘积的和是ab+ac+bc等于(sum² - sum各平方) / 2。对的。这样的话,计算一段的美味值就可以用O(1)的时间了,前提是知道这段的总和和平方和。

那这样的话,每个段的美味值可以用(sum^2 - sum_sq) / 2来计算。这样确实高效。那我们需要预处理前缀和数组以及前缀平方和数组。比如,prefix_sum[i]是前i个元素的和,prefix_sq_sum[i]是前i个元素的平方和。那么,对于区间[l, r],sum是prefix_sum[r] - prefix_sum[l-1],sum_sq是prefix_sq_sum[r] - prefix_sq_sum[l-1]。然后美味值就是(sum² - sum_sq)/2。

好的,这样计算每段的美味值的问题解决了。那现在的问题转化为,如何将数组分成M段,使得最大的段的美味值尽可能小。这显然是一个二分答案的问题。我们需要找到一个最小的可能的最大值,使得存在一种分法,分成的各段的美味值都不超过这个值,而且段的数量不超过M。

那二分的思路是,假设当前的中值是mid,我们需要判断是否可以将其分成不超过M段,每段的美味值都不超过mid。如果可以的话,说明我们可以尝试更小的mid;否则,需要更大的mid。

那么,如何实现这个判断函数呢?也就是check(mid)函数。这个函数的逻辑是,尽可能多地分割数组,使得每一段的美味值不超过mid。如果分割后的段数k <= M,那么返回true,否则返回false。

比如,初始的时候,假设mid足够大,那么只需要分成1段,所以返回true。如果mid很小,可能需要分成很多段,超过M,则返回false。

那具体的分割方法是什么呢?我们可以用贪心的策略:遍历数组,尽可能地将当前段延长,直到加上下一个元素后,该段的美味值超过mid。此时,必须在此处分割,然后开始新的段。这样分割出来的段数是最小的可能,因为每次尽可能多地合并元素。如果这样得到的段数k <= M,那么说明mid是可行的。

这样,问题就转化为了如何高效地判断在给定mid的情况下,分割后的段数是否不超过M。因此,整个算法的步骤应该是:

1. 预处理前缀和和前缀平方和数组。

2. 二分查找可能的mid值,范围是0到最大值可能的情况。比如,当所有元素都在同一段时,最大值是总美味值,所以初始右边界可以设为这个值。

3. 对于每个mid,用贪心法分割数组,计算需要的段数。如果段数<=M,则可能可以更小,否则需要增大mid。

4. 最后找到最小的可行mid。

那现在,如何高效地计算在给定段的情况下,分割点的位置呢?例如,假设当前段的起点是left,那么需要找到最大的right,使得left到right这一段的美味值<=mid。如何快速找到这个right?

直接的做法是从left开始,逐步扩展right,直到超过mid。这样最坏情况下是O(n)的时间复杂度,每个二分步骤需要O(n)时间,总的时间复杂度是O(n log S),其中S是可能的mid的范围。对于n=1e5的数据来说,这样的时间复杂度可能可以接受,但要看具体情况。比如,如果n是1e5,log S是30的话,总共有3e6次操作,可能可以过。

那假设n是1e5的话,这样的方法是可行的。所以这可能是一个可行的解法。

现在,具体的实现步骤:

首先,预处理prefix_sum和prefix_sq_sum数组。

然后,二分查找:

初始化左边界left=0,右边界right=总美味值。总美味值可以通过计算整个数组的(sum^2 - sum_sq) / 2得到。或者,当整个数组作为一段时的美味值。

然后,每次取mid=(left+right)/2,然后判断是否可以在分割成k段,k<=M的情况下,每段的美味值<=mid。如果可以的话,尝试缩小右边界;否则,左边界增加到mid+1。

不过,这里可能需要注意二分的上下界。比如,当所有元素都为0时,总美味值为0,所以mid可能为0。或者,当每个元素都是1时,总美味值是组合数。

然后,如何计算分割的段数?

比如,初始化段数为1,当前段的起始位置是start=0。然后从第一个元素开始遍历,逐步计算当前段是否能包含下一个元素。或者更准确地说,每次确定当前段的结束位置。

或者,可以这样处理:初始start=1(假设数组是1-based的),然后遍历到i的位置,计算[start, i]这段的美味值。如果超过mid,则必须在i-1的位置分割,段数加1,然后start=i作为新的段的起点。

这个过程需要O(n)的时间,每个i都要检查一次。

现在,代码的大致结构:

预处理prefix_sum和prefix_sq_sum数组。

然后,二分循环:

while left < right:

mid = (left + right) >> 1

if check(mid) <= M:

right = mid

else:

left = mid +1

最后输出left。

而check函数的逻辑是,计算在最大允许mid的情况下,最少需要分割成多少段。如果这个数目<=M,则返回True,否则返回False。

那么,在check函数中:

初始化count=1,current_start=1(数组的起始位置),然后从current_start开始,寻找最大的end,使得current_start到end这段的美味值<=mid。如果无法找到,则必须分割。或者,另一种方法是逐个元素扩展,直到超过mid,然后分割。

例如,初始sum和sum_sq是current_start到current_end的。然后每次尝试将current_end+1加入,计算新的总和和sum_sq,然后计算美味值。如果不超过mid,则继续;否则必须分割。

或者,更高效的方式是,每次处理到i的位置,维护当前段的start到i-1的位置,尝试将i加入当前段,计算从start到i的美味值。如果超过mid,则分割,start=i,段数加1。否则,继续。

这样,遍历整个数组:

初始化start=1,count=1.

sum_total = prefix_sum[i] - prefix_sum[start-1]

sum_sq_total = prefix_sq[i] - prefix_sq[start-1]

value = (sum_total * sum_total - sum_sq_total) / 2.

如果value > mid,那么必须分割,start = i,count +=1.

否则,可以继续。

那具体来说,代码中的check函数应该怎么写呢?

比如,在遍历数组的时候,我们需要逐个元素处理。假设当前段的起始位置是last,然后对于当前i,我们计算从last到i这段的美味值。如果这个值超过mid,那么必须分割,将last设为i,段数加1。否则,继续。

所以,在循环中,从i=1到n:

sum = prefix_sum[i] - prefix_sum[last-1]

sum_sq = prefix_sq[i] - prefix_sq[last-1]

value = (sum * sum - sum_sq) / 2

如果value > mid,则无法将i加入当前段,必须分割。所以段数加1,last=i,并且当前段的sum和sum_sq就是a[i]的值。但需要注意,当分割时,i必须作为新段的起始点。例如,假设当前段是last到i-1,然后分割,那么新段的起始点是i。然后,i继续前进到i+1吗?

或者,可能我应该从i=2开始遍历?

比如,初始时last=1,段数为1。然后从i=2到n:

尝试将i加入当前段(last到i),计算这段的美味值。如果超过mid,则分割,段数加1,last设为i。

否则,继续。

这样,遍历整个数组,得到段数。如果段数<=M,则mid可行。

例如,初始last=1,段数是1。i从2到n:

计算last到i的美味值。如果超过mid,说明必须分割到i-1。然后last设为i,段数加1。否则,继续。

例如,当i=2时,last=1,计算1-2的总和和sum_sq,得到美味值。如果超过mid,则分割,段数变为2,last=2。否则,继续到i=3。

这样,遍历之后,得到的段数就是所需的最少段数吗?或者是否是尽可能多的分割?

这里可能需要注意,这样的贪心策略是否正确。例如,是否有时候分割得更早,可以得到更优的段数。例如,假设当前i到某个位置可能超过mid,但如果在中间分割的话,可能得到更少的段数。但是,贪心策略是尽可能延长当前段,这样分割的次数最少,所以得到的段数可能最少。因此,如果这样得到的段数<=M,则说明存在一种分割方式使得段数<=M,并且每段都不超过mid。因此,这样的贪心是正确的。

所以,这个贪心方法是对的。

现在,关于代码的具体实现:

在Java中,需要处理的是:

prefix_sum数组和prefix_sq数组。例如,prefix_sum[0] = 0,prefix_sum[1] = a[1], prefix_sum[2] = a[1]+a[2], etc.

然后,在check函数中,遍历i从1到n,或者从2到n?或者,可能更正确的方式是,初始段的起始位置是start=0(假设数组是0-based的),然后每次尝试将当前元素加入段中。

或者,原题中的数组可能被定义为1-based。比如,在给出的代码示例中,a数组的长度是n+10,循环从i=1到n。所以,假设原数组是1-based的。

那么,在遍历时,初始段的起点是last=1。然后,从i=2开始到n:

计算从last到i的总和和平方和,得到美味值。如果超过mid,则必须分割。此时,将段数加1,last设为i,然后继续处理i+1。

否则,继续处理i+1。

这样,遍历结束后,段数可能<=M,这时候返回true。

现在,举个例子:

比如,数组是1,2,3,分成2段。

总共有三个元素。初始last=1,段数=1.

i=2,计算1-2段的总和是3,平方和是1+4=5。美味值是 (3²-5)/2 = (9-5)/2=2,假设mid=2。此时,如果mid是2,那么当前段允许,所以继续。

i=3,计算last=1到3的总和是6,平方和是1+4+9=14。美味值是(36-14)/2=22/2=11,这超过了mid=2。所以必须分割。此时段数变为2,last=3。此时,i=3,处理结束。总共有3段?或者,原数组分成1-2作为第一段,3作为第二段。总段数是2?

哦,可能我这里的例子假设mid=2。那在i=3时,发现1-3段的值是11>2,所以分割,此时段数增加到2,last=3。然后,i继续到4(n=3),循环结束。此时,最后一个段是3,所以总段数是2,符合条件。

那此时总段数是2,所以mid=2是可行的。

所以,这样的分割方式是正确的。

因此,这样的贪心策略是正确的。

现在,回到问题。原题的代码中,给出的代码是否与这个思路一致?

看原题中的check函数:

static long check(long mid){

long count=1;

long sum=0;

int last=1;

for(int i=2;i<=n;i++){

if((sum +a[i]*(prefix[i-1]-prefix[last-1])>mid)){

count++;

last=i;

sum=0;

}else {

sum+=a[i]*(prefix[i-1]-prefix[last-1]);

}

}

return count;

}

这似乎不是正确的计算方式。因为,这里sum的计算方式似乎是在维护不同的东西。比如,这里的sum变量是累加a[i]乘以prefix[i-1]-prefix[last-1]。这可能与原问题的美味值计算方式不符。

比如,原问题的美味值计算式是sum_{i=l}^r sum_{j=i+1}^r a[i]a[j}。这等于总和的平方减去平方和的差除以二。而原代码中的sum变量似乎试图在动态维护这个值,这可能有问题。

例如,假设当前段是last到i-1。现在,处理i,将i加入段中。这时候,新的美味值应该等于原段的sum加上a[i]乘以原段的总和(即prefix[i-1]-prefix[last-1})。因为,原段的每个元素与a[i]相乘的总和等于(sum_{k=last}^{i-1}a[k])*a[i}。而这正是新增加的美味值部分。总美味值等于原来的sum加上这个部分。这可能是一个正确的动态维护方法。

例如,假设当前段是last到i-1,此时sum是该段的美味值。当加入i时,新的美味值等于原sum加上a[i] * sum_{k=last}^{i-1} a[k}。因为,原来的段中的每个元素与a[i]相乘,所以新增的项是sum_{k=last}^{i-1} a[k} * a[i}。加上原来的sum,得到新的sum。所以,总美味值等于原sum + a[i] * (prefix[i-1] - prefix[last-1}).

这可能与原问题的美味值的计算方式等价。例如,假设原来的段的美味值为sum,那么当加入a[i],新的段的美味值等于sum + a[i] * (sum of a[last..i-1})。

而sum of a[last..i-1}等于prefix[i-1] - prefix[last-1}。所以,这似乎是正确的。

因此,原代码中的sum维护的是当前段的美味值,而每加入一个新的a[i],sum增加a[i]乘以之前段的总和。这相当于计算两两乘积的总和。这样,是否正确?

举个例子,假设段是1,2,其美味值是1*2=2。当加入3,新的段是1,2,3。美味值应该是1*2 +1*3 +2*3=2+3+6=11。根据原代码的逻辑,sum初始为2(原段的美味值),当加入3时,原段的总和是3(1+2),所以sum增加3*3=9。总和变为2+9=11。这是正确的。所以,原代码中的sum维护方式是正确的。

所以,原代码中的sum变量维护的是当前段的美味值。每次尝试将i加入段时,sum会增加a[i] * (当前段的总和(即prefix[i-1] - prefix[last-1}))。这样,当sum超过mid时,必须分割。此时,当前段为last到i-1,sum重置为0,新的段从i开始。而由于新的段只有一个元素,它的美味值为0,所以sum=0是正确的。

因此,原代码中的check函数是正确的。那为什么原题中的代码可能有问题?

比如,当段从last到i-1,此时加入i时,计算新增的sum是a[i] * (prefix[i-1] - prefix[last-1}),然后将sum的总和与mid比较。如果总和超过mid,则分割。否则,sum加上这个值,继续。

所以,原代码中的逻辑是正确的。这可能是一个正确的解法。

因此,原题的代码是正确的,但需要确认。

那么,现在回到问题,原题的代码是否正确?或者是否存在错误?

举个例子,假设n=3,m=2,数组为1,2,3。整个数组的美味值是11。假设mid=11的话,分成一段,此时count=1<=2,所以mid=11可能被接受。但正确的答案可能更小。

例如,假设分成1|2,3。第一段的美味值是0,第二段的美味值是2*3=6。最大值是6。或者分成1,2 |3。最大值是2。或者分成1|2|3,此时段数为3,超过m=2。所以当m=2时,最优的分割是分成1,2 |3,最大美味值为2。或者另一种分割方式,如1 | 2,3,最大是6。显然,最优的是分成前两段,得到最大值2。所以正确的输出是2。

那原代码是否能得到正确的结果?

让我们看原代码的check函数:

初始count=1,last=1,sum=0.

i=2:

sum += a[2]*(prefix[1] - prefix[0}) → a[2]=2,prefix[1]是1,prefix[0]是0。所以2*(1-0)=2. sum现在是2. 判断是否超过mid?假设mid是2.

sum是2,等于mid,所以不分割。sum变为2.

i=3:

此时,计算sum + a[3]*(prefix[2] - prefix[last-1}=prefix[2] - prefix[0}=1+2=3. a[3]=3*3=9. sum+9=2+9=11>mid=2。所以必须分割。count增加到2,last=3,sum=0.

循环结束,count=2 <=m=2,返回true。所以此时mid=2被认为是可行的。此时,原代码的二分法会继续寻找更小的mid吗?

二分的过程是:当check(mid)<=m,则r=mid,否则 l=mid+1.

所以,在mid=2时,返回的count是2<=m=2,所以r=mid=2。此时,循环继续,直到l=r=2,所以输出2。这与预期结果一致。

这说明原代码是正确的。

那现在,问题就转化为理解原代码中的check函数如何正确维护sum的值,并且分割正确。

总结:原题的代码是正确的。它使用二分法来寻找最小的最大美味值。在check函数中,通过动态维护当前段的美味值,每次尝试将新的元素加入当前段,如果超过mid则分割。这种方法正确计算了段的美味值,并且贪心地分割,从而得到正确的最小段数。

代码

import java.util.Scanner;public class Main {static int n; // 定义全局变量 n,表示苹果序列的长度static int[] a; // 定义全局数组 a,存储苹果甜度值static long[] prefix; // 定义全局数组 prefix,用于存储前缀和public static void main(String[] args) {Scanner scan = new Scanner(System.in); // 创建 Scanner 对象,用于读取输入n = scan.nextInt(); // 读取输入的第一个整数,赋值给 n(苹果数量)int m = scan.nextInt(); // 读取输入的第二个整数,赋值给 m(分段数)// 初始化数组 a 和 prefix 的大小为 n+10,避免越界a = new int[n + 10];prefix = new long[n + 10];// 输入苹果甜度值,并计算前缀和for (int i = 1; i <= n; i++) {a[i] = scan.nextInt(); // 读取第 i 个苹果的甜度值prefix[i] = prefix[i - 1] + a[i]; // 计算前缀和:prefix[i] = sum(A[1..i])}// 二分查找的初始范围long l = 0, r = Long.MAX_VALUE; // l 表示下界,r 表示上界// 开始二分查找,寻找最小的最大美味值while (l < r) { // 当 l < r 时继续循环long mid = (l + r) >> 1; // 取中间值 mid = (l + r) / 2if (check(mid) <= m) { // 调用 check 函数,判断是否可以分成不超过 m 段r = mid; // 如果可以,则缩小上界 r} else {l = mid + 1; // 否则增大下界 l}}System.out.println(l); // 输出最终结果,即最小的最大美味值scan.close(); // 关闭 Scanner 对象}// 定义 check 函数,用于判断在限制条件下是否可以将序列分成不超过 m 段static long check(long mid) {long count = 1; // 初始化分段数为 1long sum = 0; // 初始化当前段的美味值为 0int last = 1; // 初始化当前段的起始位置为 1// 遍历整个序列,尝试划分满足条件的段落for (int i = 2; i <= n; i++) {// 计算当前苹果对当前段的贡献值long add = a[i] * (prefix[i - 1] - prefix[last - 1]);// 如果当前段的美味值加上新的贡献值超过限制 mid,则新开一段if (sum + add > mid) {count++; // 分段数加 1last = i; // 更新当前段的起始位置为 isum = 0; // 重置当前段的美味值为 0} else {sum += add; // 否则累加当前苹果的贡献值到当前段的美味值}}return count; // 返回分段数}
}

相关文章:

蓝桥杯深秋的苹果

题目 当深秋的苹果树丰收时&#xff0c;村庄的居民们兴致勃勃地采摘着红彤彤的苹果。他们将采摘下来的 NN 个苹果排成了一排&#xff0c;形成了一个苹果序列 AA&#xff0c;第 ii 个苹果的甜度值为 AiAi​&#xff08;1≤i≤N1≤i≤N&#xff09;。 现在村民需要将苹果序列划…...

【网页视频背景闪烁问题分析与解决方案】

网页视频背景闪烁问题分析与解决方案 现象描述 在开发带有视频背景的网页时&#xff0c;我们遇到了一个棘手的问题&#xff1a;当用户滚动页面时&#xff0c;视频背景区域会出现明显的闪烁现象&#xff0c;具体表现为&#xff1a; 文字内容会突然变亮或变大视频背景会突然变…...

Server 6 ,VMware 解析,ESXi 与 Workstation 应用指南(VMware ESXi 与 VMware Workstation)

目录 前言 一、VMware公司介绍 二、主要产品和技术 2.1 服务器虚拟化 2.2 桌面虚拟化 2.3 网络虚拟化与安全 2.4 云管理平台 2.5 存储与可用性 三、VMware ESXi 3.1 ESXi 是什么“超级神器” 3.2 安装与网络配置如何掌握 3.3 访问与管理如何玩转 3.4 下载地址与官网…...

今天你学C++了吗?——string(上)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

使用通义万相Wan2.1进行视频生成

使用通义万相Wan2.1进行视频生成 源代码准备运行环境准备创建Python虚拟环境并激活安装依赖包 模型下载生成视频官网的视频生成例子简单描述场景视频生成示例详细描述场景视频生成示例 最近通义万相开源了其视频生成模型。模型有两个版本&#xff0c;一个是1.3B的&#xff0c;一…...

Windows在多网络下指定上网接口

Windows在多网络下指定上网接口 一、说明 设备情况&#xff1a;win11&#xff0c;同时连接了有线网和WLAN&#xff0c;有线网连接着NAS必须保持连接。需求&#xff1a;有些情况时&#xff0c;有线网无网络而WLAN有网&#xff0c;但系统仍走着有线导致无法上网。 二、方法 过…...

前端正则表达式完全指南:从入门到实战

文章目录 第一章&#xff1a;正则表达式基础概念1.1 什么是正则表达式1.2 正则表达式工作原理1.3 基础示例演示 第二章&#xff1a;正则表达式核心语法2.1 元字符大全表2.2 量词系统详解2.3 字符集合与排除 第三章&#xff1a;前端常用正则模式3.1 表单验证类3.1.1 邮箱验证3.1…...

【愚公系列】《Python网络爬虫从入门到精通》038-SQLite数据库

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

npx degit 问题:could not fetch remote...

问题与处理策略 问题描述 npx degit dream-num/univer-sheet-start-kit univer-sheet-start-kit执行上述指令&#xff0c;报如下错误 ! could not fetch remote https://github.com/dream-num/univer-sheet-start-kit ! could not find commit hash for HEAD# 翻译无法获取远…...

空投与转账:Solana代币核心概念及代码实战精解

目录 1.空投和转账概念 1.1.空投(Airdrop) 1.2.转账(Transfer) 2.Solana 代币创建与空投核心代码总结 2.1. 代币创建核心代码 2.2. 添加元数据核心代码 2.3. 空投代币核心代码 3.效果图展示 1.空投和转账概念 1.1.空投(Airdrop) 创建新代币: 空投是铸造(Mint)新代币…...

Rust~tokio的AsyncRead

AsyncRead trait 定义 介绍 /// This trait is analogous to the [std::io::Read] trait, but integrates with /// the asynchronous task system. In particular, the [poll_read] method, /// unlike [Read::read], will automatically queue the current task for wakeup…...

NO.22十六届蓝桥杯备战|一维数组|七道练习|冒泡排序(C++)

B2093 查找特定的值 - 洛谷 题⽬要求下标是从0开始的&#xff0c;和数组的下标是吻合的&#xff0c;存放数据应该从下标0开始n的取值范围是1~10000数组中存放的值的绝对值不超10000&#xff0c;说明int类型就⾜够了找到了输出下标&#xff0c;找不到要输出-1&#xff0c;这⼀点…...

Linux下的网络通信编程

在不同主机之间&#xff0c;进行进程间的通信。 1解决主机之间硬件的互通 2.解决主机之间软件的互通. 3.IP地址&#xff1a;来区分不同的主机&#xff08;软件地址&#xff09; 4.MAC地址&#xff1a;硬件地址 5.端口号&#xff1a;区分同一主机上的不同应用进程 网络协议…...

【JavaWeb13】了解ES6的核心特性,对于提高JavaScript编程效率有哪些潜在影响?

文章目录 &#x1f30d;一. ES6 新特性❄️1. ES6 基本介绍❄️2. 基本使用2.1 let 声明变量2.2 const 声明常量/只读变量2.3 解构赋值2.4 模板字符串2.5 对象拓展运算符2.6 箭头函数 &#x1f30d;二. Promise❄️1. 基本使用❄️2. 如何解决回调地狱问题2.1回调地狱问题2.2 使…...

每日一题之屏蔽信号

问题描述 在与三体文明的对抗中&#xff0c;人类联邦探测到了两个重要的信号源&#xff0c;分别用非负整数 aa 和 bb 来表示。 为了抵御三体舰队的入侵&#xff0c;科学家们制定出一项关键策略——屏蔽信号&#xff0c;目标是要让 aa、bb 这两个信号源其中之一的数值归零。 在…...

TCP如何保证可靠性

目录 回顾TCP协议TCP报文头部 TCP如何保证可靠性&#xff1f;校验和序列号确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制&#xff08;三次握手和四次挥手&#xff09;流量控制滑动窗口滑动机制 拥塞控制慢开始 & 拥塞避免快重传 & 快恢复 回顾TCP协…...

HTTP协议深度解析:从Tomcat到HTTPS的全方位探索

目录 引言 一、Tomcat部署与Servlet容器 1.1 Tomcat部署流程 1.2 Tomcat与Servlet 二、HTTP协议的基础构成 2.1 URL 2.2 HTTP请求与响应 2.3 HTTP状态码 三、计算机网络与数据传输 3.1 局域网与路由器 3.2 IP地址与MAC地址 3.3 域名与DNS 四、HTTPS协议与数据加密…...

互联网医院实时数据监测智能分析系统设计概述(下)

阶段4:可视化仪表盘与用户界面开发 在这一阶段,我们将使用 Plotly Dash 来设计一个实时预测仪表盘,用于展示疾病传播趋势、医生评估信息等。我们还将实现实时数据更新与展示,确保数据能够及时反映系统中的变化。 1. 设计实时预测仪表盘 步骤 1:安装 Dash 依赖 首先,确…...

性能测试测试策略制定|知名软件测评机构经验分享

随着互联网产品的普及&#xff0c;产品面对的用户量级也越来越大&#xff0c;能抗住指数级增长的瞬间访问量以及交易量是保障购物体验是否顺畅的至关重要的一环&#xff0c;而我们的性能测试恰恰也是为此而存在的。 性能测试是什么呢&#xff1f;性能测试要怎么测呢&#xff1f…...

【AI+智造】在阿里云Ubuntu 24.04上部署DeepSeek R1 14B的完整方案

作者&#xff1a;Odoo技术开发/资深信息化负责人 日期&#xff1a;2025年2月28日 一、部署背景与目标 DeepSeek R1作为国产大语言模型的代表&#xff0c;凭借其强化学习驱动的推理能力&#xff0c;在复杂任务&#xff08;如数学问题、编程逻辑&#xff09;中表现优异。本地化部…...

蓝桥真题讲解

温馨提示&#xff1a;本系列文章非所有题都对对b组适用&#xff0c;b组的小伙伴请挑题看&#xff01; 目录 第一题 题目链接 题目解析 代码原理 代码编写 本题总结 第二题 题目链接 题目解析 代码原理 代码编写 本题总结 第三题 题目链接 题目解析 代码原理 …...

javaweb将上传的图片保存在项目文件webapp下的upload文件夹下

前端HTML表单 (upload.html) 首先&#xff0c;创建一个HTML页面&#xff0c;允许用户选择并上传图片。 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>图片上传</title> </head> <…...

北京大学DeepSeek与AIGC应用(PDF无套路下载)

近年来&#xff0c;人工智能技术飞速发展&#xff0c;尤其是大模型和生成式AI&#xff08;AIGC&#xff09;的突破&#xff0c;正在重塑各行各业的生产方式与创新路径。 北京大学联合DeepSeek团队推出的内部研讨教程《DeepSeek与AIGC应用》&#xff0c;以通俗易懂的方式系统解…...

测量海拔以及两点间路程(十六)

一、DigitalEarthView.cpp void CDigitalEarthView::OnCheckCheliang() {isTestJu = !isTestJu;mOSG->isTestJu(isTestJu); } 二、OSGObject.cpp void COSGObject::isTestJu(bool isTest) {theApp.bNeedModify = TRUE;while(!theApp.bCanModify)Sleep(1);if(isTest){eh-&…...

Flutter状态管理框架GetX最新版详解与实践指南

一、GetX框架概述 GetX是Flutter生态中轻量级、高性能的全能开发框架&#xff0c;集成了状态管理、路由导航、依赖注入等核心功能&#xff0c;同时提供国际化、主题切换等实用工具。其优势在于代码简洁性&#xff08;减少模板代码约70%&#xff09;和高性能&#xff08;基于观…...

8. 示例:对32位数据总线实现位宽和值域覆盖

文章目录 前言示例一&#xff1a;示例二&#xff1a;示例三&#xff1a;仿真与覆盖率分析覆盖点详细说明覆盖率提升技巧常见错误排查 示例四&#xff1a;仿真步骤 前言 针对32位数据总线实现位宽和值域的覆盖&#xff0c;并且能够用xrun运行&#xff0c;查看日志和波形。cover…...

第6篇:面向对象编程重构系统

一、OOP重构目标 数据封装:隐藏实现细节​接口抽象:规范操作入口资源自治:实现自管理生命周期扩展基础:预留多态支持接口二、完全面向对象实现(完整代码) #include <iostream> #include <Windows.h> #include <li...

CTF-web: Rust 的过程宏

Rust 的过程宏&#xff08;Procedural Macros&#xff09;是一种强大的元编程工具&#xff0c;允许你在编译时对代码进行操作和生成。与属性宏和派生宏不同&#xff0c;过程宏可以接收并处理任意 Rust 代码&#xff0c;生成新的代码片段。这里有一个简单的例子来说明 Rust 的过…...

【Kubernetes】API server 限流 之 maxinflight.go

这个文件实现了一个基于信号量(Channel)的简单限流器。 基础知识 总共有四种channel 带缓冲的channel nonMutatingChan、mutatingChan 都是带缓冲的channel &#xff0c;这类channel 的特点是&#xff1a; 这允许最多 mutatingLimit /nonMutatingLimit 个请求同时获取令牌并执…...

phpstudy安装教程dvwa靶场搭建教程

GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA) Dvwa下载地址 Windows版phpstudy下载 - 小皮面板(phpstudy) 小皮下载地址 1选择windows 版本&#xff0c;点击立即下载 下载完成&#xff0c;进行解压&#xff0c;注意不要有中文路径 点击.exe文件进行安装…...

React核心知识及使用场景

React是一个用于构建用户界面的JavaScript库,尤其适合构建单页面应用(SPA)。它基于组件化的开发思想,主要特点是通过虚拟DOM来提高渲染效率。以下是React的核心知识和使用场景: 一. 核心知识 组件化: 类组件和函数组件:React的组件分为类组件和函数组件。类组件通过继承…...

杰发科技AC7801——滴答定时器获取时间戳

1. 滴答定时器 杰发科技7801内部有一个滴答定时器&#xff0c;该定时器是M0核自带的&#xff0c;因此可以直接用该定时器来获取时间戳。 同样&#xff0c;7803也可以使用该方式获取时间戳。 2. 滴答定时器原理 SysTick是一个24位的递减计数器&#xff0c;它从预设的重装载值…...

「爬虫实战分享:如何高效爬取某汽车官方销售排行榜」

本文目录 &#x1f496;前言一、&#x1f4ab;代理IP的作用二、&#x1f4ab;爬虫中的挑战1.代理IP的质量和稳定性2.IP封禁问题3. 反爬虫技术的升级 三、&#x1f4ab;亮数据动态代理&#xff1a;数据采集的可靠伙伴1、真实体验 四、&#x1f4ab;爬虫实战&#xff1a;使用亮数…...

AI数据分析:用DeepSeek做数据清洗

在当今数据驱动的时代&#xff0c;数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展&#xff0c;AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行数据清洗。 数据清洗是数据分析的基础&#xff0c;其目的是…...

使用串口工具实现tcp与udp收发

1、使用串口工具实现tcp收发 2、使用串口工具实现udp收发...

onlyoffice 服务搭建及配置 - 前端 office 文件预览解决方案

文章目录 1. 安装1.1 环境要求1.2 安装步骤1.3 常用配置1.3.1 安装目录/config/default.json1.3.2 安装目录/config/local.json1.3.3 安装目录/nginx/conf1.3.4 配置生效 2. 网站嵌入2.1 代码示例2.2 最终效果 3. 常见问题3.1 数据库配置错误导致加载不出来 1. 安装 写文章时使…...

PostgreSQL的基本使用

参考视频&#xff1a;零基础入门PostgreSQL教程 文章目录 一、PostgreSQL是什么&#xff1f;二、基本使用1.下载2.操作 一、PostgreSQL是什么&#xff1f; PostgreSQL 是一个免费的对象-关系数据库服务器&#xff0c;在灵活的BSD许可证下发行。 二、基本使用 1.下载 2.操作 …...

【AI深度学习基础】NumPy完全指南入门篇:核心功能与工程实践(含完整代码)

NumPy系列文章 入门篇进阶篇终极篇 一、NumPy简介 NumPy&#xff08;Numerical Python&#xff09;是Python中科学计算的核心库&#xff0c;提供了高性能的多维数组对象和各种用于数组操作的函数。它是Python数据分析和科学计算的基础&#xff0c;被广泛应用于机器学习、数据…...

武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司举行校企联培座谈会

2025年2月21日下午&#xff0c;武汉大学生命科学学院与谱度众合&#xff08;武汉&#xff09;生命科技有限公司&#xff08;以下简称“谱度众合”&#xff09;在学院学术厅举行校企联培专业学位研究生合作交流会。武汉大学生命科学学院副院长刘星教授、生命科学学院周宇教授、产…...

小程序画带圆角的圆形进度条

老的API <canvas id"{{canvasId}}" canvas-id"{{canvasId}}" style"opacity: 0;" class"canvas"/> startDraw() {const { canvasId } this.dataconst query this.createSelectorQuery()query.select(#${canvasId}).bounding…...

MR-图解

1、不是所有的MR都适合combine 1.1、map端统计出了不同班级的每个学生的年龄 如&#xff1a;(class1, 14)表示class1班的一个学生的年龄是14岁。 第一个map任务&#xff1a; class1 14 class1 15 class1 16 class2 10第二个map任务&#xff1a; class1 16 class2 10 class…...

[深度学习] 大模型学习2-提示词工程指北

在文章大语言模型基础知识里&#xff0c;提示词工程&#xff08;Prompt Engineering&#xff09;作为大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;应用构建的一种方式被简要提及&#xff0c;本文将着重对该技术进行介绍。 提示词工程就是在和LLM聊…...

VSCode离线安装插件

最近在其他电脑设备上部署vscode环境出现问题&#xff0c;在vscode里直接安装插件失败&#xff0c;软件提示如下&#xff1a;&#xff08;此前已经用此方法安装过中文插件&#xff09; 这里我们选择手动下载&#xff0c;会自动在浏览器中跳转到该插件的下载链接并自动下载插件&…...

python-leetcode-删除并获得点数

740. 删除并获得点数 - 力扣&#xff08;LeetCode&#xff09; 解法 1&#xff1a;动态规划&#xff08;O(n) 时间&#xff0c;O(n) 空间&#xff09; class Solution:def deleteAndEarn(self, nums: List[int]) -> int:if not nums:return 0# 统计每个数的贡献points Cou…...

Spring Boot 流式响应豆包大模型对话能力

当Spring Boot遇见豆包大模型&#xff1a;一场流式响应的"魔法吟唱"仪式 一、前言&#xff1a;关于流式响应的奇妙比喻 想象一下你正在火锅店点单&#xff0c;如果服务员必须等所有菜品都备齐才一次性端上来&#xff0c;你可能会饿得把菜单都啃了。而流式响应就像贴…...

STM32G431RBT6——(1)芯片命名规则

相信很多新手入门STM学的芯片&#xff0c;是STM32F103C8T6&#xff0c;假如刷到个项目换个芯片类型&#xff0c;就会感到好难啊&#xff0c;看不懂&#xff0c;就无从下手&#xff0c;不知所云。其实没什么难的&#xff0c;对于一个个不同的芯片的区别&#xff0c;就像是学习包…...

React进阶之前端业务Hooks库(三)

前端业务Hooks库 hooks 方法localStorage和sessionStorager区别packages/hooks/src/useLocalStorageStatepackages/hooks/src/useSessionStorageStatepackages/hooks/src/createUseStorageState模块Hooks在不同场景下的应用Hooks陷阱前提例子useLatest和useMemoizedFn其他功能的…...

卷积神经网络梯度下降方向与参数更新方向的一致性论述

梯度下降是一种常用的优化算法&#xff0c;用于最小化损失函数&#xff0c;在机器学习和深度学习领域有着广泛的应用。分别对梯度下降、梯度方向以及参数更新采用负梯度方向的原因进行论述。 1.梯度下降 它的基本思想是通过迭代的方式来更新模型的参数&#xff0c;使得损失函数…...

python 视频网站爬虫教程,爬虫入门教程(付安装包)

文章目录 前言1. 环境准备Python安装选择Python开发环境安装必要库 2. 了解目标网站3. 发送请求获取页面内容4. 解析页面内容&#xff0c;提取视频链接5. 下载视频6. 处理反爬机制7. 完整代码示例注意事项 前言 以下为你生成一份 Python 视频网站爬虫教程&#xff0c;以爬取简…...

Is Noise Conditioning Necessary for Denoising Generative Models?论文阅读笔记

很吸引人的一个标题&#xff0c;很吸引人的一个作者&#xff0c;来读一读明神的新作&#xff0c;讲的是怎么把去噪领域的一些有意思的思想&#xff0c;特别是blind denoising和noise-level estimation的思想&#xff0c;应用到denoising diffusion模型中&#xff0c;从而去掉de…...