打卡信奥刷题(1845)用C++实现信奥 P9325 [CCC 2023 S2] Symmetric Mountains
这个题目要求我们为不同长度的连续山脉子序列找到最对称的裁剪。对称性通过计算每对等距山峰高度差的绝对值之和来衡量。对于每个可能的子序列长度1到N,我们需要找到不对称值最小的那个子序列。 解题思路是: 遍历所有可能的子序列长度(从1到N) 对于每个长度,滑动窗口遍历所有可能的子序列 计算每个子序列的不对称值(从两端向中间配对计算绝对差之和) 记录并输出每个长度下的最小不对称值 样例输入1的输出解释展示
P9325 [CCC 2023 S2] Symmetric Mountains
题目描述
Rebecca 是一名导游,正在为她的杂志推广落基山脉。她最近拍了一张包含 NNN 座山的美丽照片,其中从左到右第 iii 座山的高度为 hih_ihi。她将为她的杂志裁剪这张照片,可能会从照片的左侧移除一些山,也可能会从照片的右侧移除一些山。也就是说,裁剪包括从第 lll 座山到第 rrr 座山的连续山峰,其中 l≤rl \leq rl≤r。为了取悦她的杂志读者,Rebecca 将尝试找到最对称的裁剪。
我们将裁剪的不对称值定义为从裁剪的中点开始,每对等距山峰的高度差的绝对值之和。为了帮助理解这个定义,注意到一个数 vvv 的绝对值,记为 ∣v∣|v|∣v∣,是 vvv 的非负值:例如 ∣−6∣=6|-6| = 6∣−6∣=6 和 ∣14∣=14|14| = 14∣14∣=14。裁剪的不对称值是所有 ∣hl+i−hr−i∣|h_{l+i} - h_{r-i}|∣hl+i−hr−i∣ 的和,其中 0≤i≤r−l20 \leq i \leq \frac{r-l}{2}0≤i≤2r−l。换句话说,我们从外向内配对山峰,计算每对山峰高度差的绝对值,并将它们相加。
因为 Rebecca 不知道照片需要多宽,所以对于所有可能的裁剪长度,找到不对称值最小的裁剪(即最对称的裁剪)。
输入格式
第一行由一个整数 NNN 组成,表示照片中山的数量。
第二行由 NNN 个以空格分隔的整数组成,其中从左到右第 iii 个整数表示 hih_ihi。
下表显示了可用的 15 分的分配方式:
分数 | NNN 的范围 | hih_ihi 的范围 | 额外限制 |
---|---|---|---|
555 | 1≤N≤3001 \leq N \leq 3001≤N≤300 | 0≤hi≤1050 \leq h_i \leq 10^50≤hi≤105 | 无。 |
555 | 1≤N≤50001 \leq N \leq 50001≤N≤5000 | 0≤hi≤1050 \leq h_i \leq 10^50≤hi≤105 | 山的高度从左到右单调不减。 |
555 | 1≤N≤50001 \leq N \leq 50001≤N≤5000 | 0≤hi≤1050 \leq h_i \leq 10^50≤hi≤105 | 无。 |
输出格式
输出一行 NNN 个以空格分隔的整数,其中从左到右第 iii 个整数是长度为 iii 的裁剪中最对称的裁剪的不对称值。
输入输出样例 #1
输入 #1
7
3 1 4 1 5 9 2
输出 #1
0 2 0 5 2 10 10
输入输出样例 #2
输入 #2
4
1 3 5 6
输出 #2
0 1 3 7
说明/提示
对样例输入 1 的输出解释:
我们将展示为什么从左数第五个值是 2。让我们尝试计算所有长度为 5 的裁剪的不对称值。
第一个裁剪中山的高度是 [3,1,4,1,5][3, 1, 4, 1, 5][3,1,4,1,5]。这个裁剪的不对称值是 ∣3−5∣+∣1−1∣+∣4−4∣=2|3 - 5| + |1 - 1| + |4 - 4| = 2∣3−5∣+∣1−1∣+∣4−4∣=2。
第二个裁剪中山的高度是 [1,4,1,5,9][1, 4, 1, 5, 9][1,4,1,5,9]。这个裁剪的不对称值是 ∣1−9∣+∣4−5∣+∣1−1∣=9|1 - 9| + |4 - 5| + |1 - 1| = 9∣1−9∣+∣4−5∣+∣1−1∣=9。
最后一个裁剪中山的高度是 [4,1,5,9,2][4, 1, 5, 9, 2][4,1,5,9,2]。这个裁剪的不对称值是 ∣4−2∣+∣1−9∣+∣5−5∣=10|4 - 2| + |1 - 9| + |5 - 5| = 10∣4−2∣+∣1−9∣+∣5−5∣=10。
因此,长度为 5 的最对称裁剪是不对称值为 2 的裁剪。
对样例输入 2 的输出解释:
这个样例满足第二个子任务。注意,唯一长度为 4 的裁剪是 [1,3,5,6][1, 3, 5, 6][1,3,5,6],其不对称值为 ∣1−6∣+∣3−5∣=7|1 - 6| + |3 - 5| = 7∣1−6∣+∣3−5∣=7。
本题采用捆绑测试:
-
子任务 1(5 分):1≤N≤3001\leq N \leq 3001≤N≤300,0≤hi≤1050\leq h_i \leq 10^50≤hi≤105。
-
子任务 2(5 分):1≤N≤50001 \leq N \leq 50001≤N≤5000,0≤hi≤1050 \leq h_i \leq 10^50≤hi≤105,保证山的高度从左到右单调不减。
-
子任务 3(5 分):1≤N≤50001\leq N\leq 50001≤N≤5000,0≤hi≤1050 \leq h_i \leq 10^50≤hi≤105。
题面翻译由 ChatGPT-4o 提供。
C++实现
#include <iostream>
using namespace std;
typedef long long ll;
#define int long long
int a[10101];
signed main(){
int n;
scanf("%lld", &n);
for(int i = 1; i <= n; ++i){
scanf("%lld", &a[i]);
}
for(int len = 1; len <= n; ++len){
int l = 1, r = len;
int cz = 1e15;
while(r <= n){
int L = l, R = r, nowcz = 0;
while(L <= R){
nowcz += abs(a[L] - a[R]);
L++;
R--;
}
++l;++r;
cz = min(cz, nowcz);
}
printf("%lld ", cz);
}
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐
所有评论(0)