P1018小核桃与数组规则 普及- CSP-J组 排序 线性DP 标准IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 通过/尝试次数 2225/2901 题目描述 小核桃身处在一个神秘的逃生游戏中,他需要通过解决各种谜题来获得能够帮助他逃脱的物品。在一道谜题中,小核桃被赋予了一个整数数组和一组规则,让他按顺序进行操作。以下是给小核桃的指示:给定一个整数数组,请按以下方法计算得分最高的方案: 首先选择一个整数 v v 并删除数组中所有等于 v v 的元素,并将它们的总和加入积分中。 同时,删除数组中所有等于 v + 1 v+1 或 v − 1 v−1 的元素,这些元素不得分。 重复上述步骤,直到数组中没有更多的元素为止。 现在,小核桃需要计算按照这些规则可以获得的最大分数是多少? 输入描述 第一行包含一个整数 n n,表示有 n n 个整数。 第二行包含 n n 个整数,表示第 i i 个数字值为 a i a i ,之间以一个空格隔开。 输出描述 计算出小核桃按照规则可以获得的最大分数。 input1 复制
```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAXN = 100005; long long cnt[MAXN]; long long dp[MAXN]; int main() { int n; cin >> n; int num; for (int i = 0; i < n; i++) { cin >> num; // 统计每个数字出现的总和 cnt[num] += num; } // 动态规划计算最大得分 dp[0] = 0; dp[1] = cnt[1]; for (int i = 2; i < MAXN; i++) { // 状态转移方程:要么不选当前数字,最大得分等于前一个数字的最大得分;要么选当前数字,最大得分等于前两个数字的最大得分加上当前数字的总和 dp[i] = max(dp[i - 1], dp[i - 2] + cnt[i]); } // 最终结果是dp数组中的最大值 cout << dp[MAXN - 1] << endl; return 0; } ``` 代码解释 1. 统计数字总和: - 用`cnt`数组统计每个数字出现的总和。输入数字后,将对应数字的总和累加到`cnt`数组中。 2. 动态规划: - 定义`dp`数组,`dp[i]`表示处理到数字`i`时能获得的最大分数。 - 初始化`dp[0] = 0`,`dp[1] = cnt[1]`。 - 状态转移方程:`dp[i] = max(dp[i - 1], dp[i - 2] + cnt[i])`。表示要么不选当前数字`i`,最大得分等于前一个数字的最大得分;要么选当前数字`i`,最大得分等于前两个数字的最大得分加上当前数字的总和。 3. 输出结果: - 最终结果是`dp`数组中的最大值,即`dp[MAXN - 1]`。 复杂度分析 - 时间复杂度:$O(N + MAXN)$,其中$N$是输入数组的长度,$MAXN$是数字的最大值。 - 空间复杂度:$O(MAXN)$,主要用于存储`cnt`和`dp`数组。 [2026-02-07 18:38:00 | AI问答 | 555点数解答]
- [字节豆包] P1018小核桃与数组规则 普及- CSP-J组 排序 线性DP 标准IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 通过/尝试次数 2225/2901 题目描述 小核桃身处在一个神秘的逃生游戏中,他需要通过解决各种谜题来获得能够帮助他逃脱的物品。在一道谜题中,小核桃被赋予了一个整数数组和一组规则,让他按顺序进行操作。以下是给小核桃的指示:给定一个整数数组,请按以下方法计算得分最高的方案: 首先选择一个整数 v v 并删除数组中所有等于 v v 的元素,并将它们的总和加入积分中。 同时,删除数组中所有等于 v + 1 v+1 或 v − 1 v−1 的元素,这些元素不得分。 重复上述步骤,直到数组中没有更多的元素为止。 现在,小核桃需要计算按照这些规则可以获得的最大分数是多少? 输入描述 第一行包含一个整数 n n,表示有 n n 个整数。 第二行包含 n n 个整数,表示第 i i 个数字值为 a i a i ,之间以一个空格隔开。 输出描述 计算出小核桃按照规则可以获得的最大分数。 input1 复制 (555点数解答 | 2026-02-07 18:38:00)3
- [GPT] def knapsack_with_solutions(n, g, weights, values): dp = [[0] * (g + 1) for _ in range(n + 1)] count = [[0] * (g + 1) for _ in range(n + 1)] for i in range(n + 1): count[i][0] = 1 for i in range(1, n + 1): for j in range(g + 1): dp[i][j] = dp[i - 1][j] count[i][j] = count[i - 1][j] if j >= weights[i - 1]: if dp[i][j] < dp[i - 1][j - weights[i - 1]] + values[i - 1]: dp[i][j] = dp[i - 1][j - w(760点数解答 | 2024-06-09 18:21:03)288
- [GPT] def knapsack(n, g, w, v): dp = [[0] * (g + 1) for _ in range(n + 1)] for i in range(1, n + 1): for j in range(1, g + 1): if w[i - 1] <= j: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1]) else: dp[i][j] = dp[i - 1][j] max_value = dp[n][g] def backtrack(i, j, path, current_value): if i == 0 or j == 0: if current_value == max_value: s(191点数解答 | 2024-06-09 19:21:11)267
- [字节豆包] function BWB takes nothing returns nothing local integer dP=LoadInteger(Y2,GetHandleId(GetTriggeringTrigger()),$CFDE6C76) set dP=dP+3 call SaveInteger(Y2,GetHandleId(GetTriggeringTrigger()),$CFDE6C76,dP) call SaveInteger(Y2,GetHandleId(GetTriggeringTrigger()),$ECE825E7,dP) call SaveGroupHandle(Y2,GetHandleId(GetTriggeringTrigger())*dP,$214C62CC,**3(GetPlayableMapRect())) call ForGroupBJ(LoadGroupHandle(Y2,GetHandleId(GetTriggeringTrigger())*dP,$214C62CC),function BV9) call GroupClear(LoadGroupHa(846点数解答 | 2025-10-27 19:10:27)69
- [字节豆包] P1019小核桃与积木堆 普及- CSP-J组 排序 贪心 标准IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 通过/尝试次数 1787/2245 题目描述 数字线上的某些整数坐标处有 n n 个积木,小核桃不喜欢积木四处散落。所以他打算搬动积木,堆成不超过 m m 堆的积木堆。将坐标值 X X 的积木全部搬到到坐标值 Y Y 处,需要消耗 ∣ X − Y ∣ ∣X−Y∣ 的能量。 计算小核桃把玩具堆成不超过 m m 堆需要消耗的最小能量值。 输入描述 第一行包含两个整数,之间以一个空格隔开,分别是 n n, m m, n n 代表积木总数量, m m 代表最大堆数。 第二行包含 n n 个整数, x i x i 表示积木 i i 所处坐标值为 a i a i ,之间以一个空格隔开。 输出描述 计算出把积木堆成不超过 m m 堆需要消耗的最小能量值。 input1 复制 4 1 10 5 3 12 output1 复制 9 input2 复制 4 2 1 20 3 100 output2 复制(780点数解答 | 2026-02-07 18:38:58)3
- [字节豆包] 题目描述 在甜甜圈王国中,每颗甜甜圈都有一个甜度值 S 来衡量其甜蜜程度。根据甜度的不同,甜甜圈被评定为不同的等级,具体规则如下: 如果 S 在 0 到 25 之间(包含 0 和 25 ),输出 "普通甜甜圈"; 如果 S 在 26 到 50 之间(包含 26 和 50 ),输出 "美味甜甜圈"; 如果 S 在 51 到 75 之间(包含 51 和 75 ),输出 "极品甜甜圈"; 如果 S 在 76 到 99 之间(包含 76 和 99 ),输出 "绝世甜甜圈"; 如果 S 等于 100 ,输出 "传说甜甜圈"。 请根据给定的甜度值 S,输出对应的甜甜圈等级名称。 输入格式 一行一个整数 S,表示甜甜圈的甜度值。(243点数解答 | 2025-12-06 18:35:50)61
- [字节豆包] P1020小核桃与删除字符串 普及+/提高 CSP-J组 双指针 二分答案 标准IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 通过/尝试次数 1481/2524 题目描述 给一个长度为 n n 的 01 01 字符串,你可以任意选择下面两个操作任意次: 从左往右删除任意长度连续段 从右往左删除任意长度连续段 现在要求 m a x ( 删掉的 1 , 剩下的 0 ) max(删掉的1,剩下的0) 最小。 输入描述 输入一行只包含 01 01 的字符串。 输出描述 输出一个整数,表示答案。 input1 复制 1001001001001 output1 复制 3 input2 复制 111011001000 output2 复制 1用C++(330点数解答 | 2026-02-07 18:40:10)3
- [字节豆包] P1015禾木与栅栏 普及- 模拟 标准IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 通过/尝试次数 2998/4446 题目描述 面条老师给禾木一个任务,让他根据给定的 n n 和 k k ,打印出一个栅栏图案,这个栅栏应该分成 n n 段,段与段之间的间隔为 | ,段内的填充为 k k 个 = 。 例如 n = 5 , k = 6 n=5,k=6 时,栅栏图案如下: 复制 |======|======|======|======|======| 输入格式 输入包括一行,包含两个整数 n , k n,k,表示栅栏的段数和每一段中填充的数量。 输出格式 输出包括一行,表示符合要求的栅栏图案。 input1 复制 1 1 output1 复制 |=| input2 复制 5 5 output2 复制 |=====|=====|=====|=====|=====| 提示 对于 100 % 100% 的数据,保证 1 ≤ n , k ≤ 15 1≤n,k≤15,用C++(160点数解答 | 2026-02-07 18:36:06)3
- [字节豆包] P1014禾木与数字区间 入门 新手组 if 语句 标准IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 通过/尝试次数 3691/5817 题目描述 星宇博士给禾木一个任务,让他根据给定的 a a 和 b b ,判断数字 x x 是否在 10 a 10 a 至 10 b 10 b 之间,下面请你编程帮助禾木完成这个任务吧。 输入格式 输入包括两行。 第一行包含两个正整数 a , b a,b ,表示数字的范围 a a 和 b b。 第二行包含一个正整数 x x ,表示给定的数字 x x。 输出格式 输出包括一行。 若 10 a ≤ x ≤ 10 b 10 a ≤x≤10 b ,输出 yes 。 若 10 b < x 10 b <x ,输出 big 。 若 x < 10 a x<10 a ,输出 small 。 input1 复制 1 3 22 output1 复制 yes input2 复制 1 2 333 output2 复制 big 提示 对于 100 % 100%(367点数解答 | 2026-02-07 18:34:36)3
- [字节豆包] P1014禾木与数字区间 入门 新手组 if 语句 标准IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 通过/尝试次数 3691/5817 题目描述 星宇博士给禾木一个任务,让他根据给定的 a a 和 b b ,判断数字 x x 是否在 10 a 10 a 至 10 b 10 b 之间,下面请你编程帮助禾木完成这个任务吧。 输入格式 输入包括两行。 第一行包含两个正整数 a , b a,b ,表示数字的范围 a a 和 b b。 第二行包含一个正整数 x x ,表示给定的数字 x x。 输出格式 输出包括一行。 若 10 a ≤ x ≤ 10 b 10 a ≤x≤10 b ,输出 yes 。 若 10 b < x 10 b <x ,输出 big 。 若 x < 10 a x<10 a ,输出 small 。 input1 复制 1 3 22 output1 复制 yes input2 复制 1 2 333 output2 复制 big 提示 对于 100 % 100%(368点数解答 | 2026-02-07 18:35:01)3
- [字节豆包] T1188密码锁 超难 2024 贪心 STEMA dp T6 1月 区间DP 标准IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 提示信息: 密码锁:由 n 个从左到右并排的圆环组成,每个圆环上都有 10 个数字(0~9),蓝色框内为密码显示区,每个圆环在密码显示区只能显示一个数字,如图所示。可以拨动圆环,来改变密码显示区显示的数字。 当密码显示区的数字与密码一致时,密码锁就会被打开。 image 编程实现: 有一个由 n 个圆环组成的密码锁,和一个 n 位的密码 S(S 由 1~9 中的数字(包含 1 和 9)组成)。每次操作只能选择一个或位置连续的多个圆环拨动。当 S 中的字符从左到右依次显示在密码显示区时,密码锁会被打开。 已知每个圆环在密码显示区初始数字都为 0,请计算最少需要操作多少次,才能打开密码锁。 注意: 1、如果选择了其中一个圆环,可将该圆环中任意一个数字拨动到密码显示区,表示 1 次操作; 例如:将第 3 个圆环拨动到数字 4,表示 1 次操作: image 2、如果选择了位置连续的多个圆环,只能将这些圆环(718点数解答 | 2025-11-08 22:09:01)72
- [字节豆包] P1007小核桃与数组变换 普及/提高- CSP-J组 模拟 标准IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 通过/尝试次数 1188/3750 题目描述 一个长度为 n n 的数组,每秒都在发生变换。 每一次变换,第 1 1 个位置的数字将会和第 2 2 个位置的数字合并,第 3 3 个位置的数字将会和第 4 4 个位置的数字合并,以此类推。。 这个数组会一直变换到只剩两个数字为止。 合并数字时,将会使得两个数字相加。例如数组 [1,2,3,4,5] 第一秒会变成 [3,7,5](前两个数字合并,第三和第四个数字合并,由于没有第六个数字,所以第五个数字不变)第二秒会变成 [10, 5],此时数组中只剩两个数字,变换结束。 现在小核桃想知道最后的两个数字的平方和是多少。例如上述数组,平方和为 10 ∗ 10 + 5 ∗ 5 = 125 10∗10+5∗5=125 由于这个数组长度很大,所以小核桃在给你数据时采用了一种新的方式。小核桃总共会给出 k k 条信息,每条信息包含两个正整数 a , b a,b,表示这个数(416点数解答 | 2026-02-07 18:24:18)1