「PAT乙级真题解析」Basic Level 1070 结绳 (问题分析+完整步骤+伪代码描述+提交通过代码)
题设要求将一些一段一段的绳子串连起来, 但是每次串连的时候需要把两段绳子都对着折后套接在一起。要求能够串连出的最大长度。 这意味着进行一次串连,两端绳子的长度都会减半, 一段绳子参与串连的次数越多(串连成新的后再去与其他绳子串连,然后再去串连,如此重复)最终能提供的长度就约短。 这意味着越长的绳子最好放在越后面进行串连,这样串连的次数会更少,能贡献的长度就越长。 所以这道题就是将给定的各段绳子长度进行升序排列, 然后按排序后顺序进行串连计算最终长度。
#算法#数据结构#c语言#需求分析#pat考试
Table of Contents
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
PAT乙级BasicLevelPractice 1070 结绳
问题分析
题设要求将一些一段一段的绳子串连起来, 但是每次串连的时候需要把两段绳子都对着折后套接在一起。要求能够串连出的最大长度。 这意味着进行一次串连,两端绳子的长度都会减半, 一段绳子参与串连的次数越多(串连成新的后再去与其他绳子串连,然后再去串连,如此重复)最终能提供的长度就约短。 这意味着越长的绳子最好放在越后面进行串连,这样串连的次数会更少,能贡献的长度就越长。 所以这道题就是将给定的各段绳子长度进行升序排列, 然后按排序后顺序进行串连计算最终长度。
完整描述步骤
- 获取输入: 绳子数量, 各段绳子的长度
- 将各段绳子按照长度降序排列
- 按照排序计算最终长度
- 初始化长度计数器值 = 最短的绳子长度
- 对于余下的每一段绳子:
- 长度计数器值 = (原值 + 当前绳子长度) / 2
- 输出长度计数器的值
伪代码描述
- get input: rope_amonut, ropes
- sort ropes ascendingly
- init recorder:
- sum = ropes[0]
- for rope in ropes[1:last]:
- sum = (sum + rope) / 2;
- print(sum);
完整提交代码
/*
# 问题分析
题设要求将一些一段一段的绳子串连起来, 但是每次串连的时候需要把两段绳子都对着折后套接在一起。要求能够串连出的最大长度。
这意味着进行一次串连,两端绳子的长度都会减半, 一段绳子参与串连的次数越多(串连成新的后再去与其他绳子串连,然后再去串连,如此重复)最终能提供的长度就约短。
这意味着越长的绳子最好放在越后面进行串连,这样串连的次数会更少,能贡献的长度就越长。
所以这道题就是将给定的各段绳子长度进行升序排列, 然后按排序后顺序进行串连计算最终长度。
# 完整描述步骤
1. 获取输入: 绳子数量, 各段绳子的长度
2. 将各段绳子按照长度降序排列
3. 按照排序计算最终长度
- 初始化长度计数器值 = 最短的绳子长度
- 对于余下的每一段绳子:
- 长度计数器值 = (原值 + 当前绳子长度) / 2
4. 输出长度计数器的值
# 伪代码描述
1. get input: rope_amonut, ropes
2. sort ropes ascendingly
3. init recorder:
- sum = ropes[0]
- for rope in ropes[1:last]:
- sum = (sum + rope) / 2;
4. print(sum);
*/
# include<stdio.h>
int cmp(const void * a, const void * b){
return *(int*)a - *(int*)b;
}
int main(){
int rope_amonut;
scanf("%d", &rope_amonut);
int ropes[rope_amonut];
for (int i = 0; i<rope_amonut;i++){
scanf("%d", &ropes[i]);
}
qsort(ropes, rope_amonut, sizeof(int), cmp);
int sum = ropes[0];
for (int i = 1; i<rope_amonut;i++){
sum += ropes[i];
sum /= 2;
}
printf("%d\n", sum);
return 0;
}