易 - 青蛙跳台阶
题目:易 - 青蛙跳台阶
描述:从前有一只青蛙想跳台阶去等峰,若该青蛙一次可以跳上1级台阶、也可以跳上2级、还可以跳3级。那么改青蛙从第0级台阶出发,在跳上第n级台阶且在第m级台阶停留过时有多少种跳法。 【使用C语言的同学,慎选此题】 **输入描述:** 第一行两个正整数,n和m m<=n **输出描述:** 一个整数,表示跳法 **输入样例:** 4 2 **输出样例:** 4
n, m = map(int, input().split())
def count_ways(n, m):
dp = [[0] * 2 for _ in range(n + 1)]
dp[0][0] = 1
for i in range(1, n + 1):
for step in [1, 2, 3]:
if i - step >= 0:
if i == m:
dp[i][1] += dp[i - step][0]
else:
dp[i][0] += dp[i - step][0]
dp[i][1] += dp[i - step][1]
return dp[n][1]
print(count_ways(n, m))
中-成绩表中查找排名第k的学生
题目:中-成绩表中查找排名第k的学生
描述:给定一个长度为n的成绩表(成绩表中包含学生的姓名、成绩【成绩保留到小数点后一位】),以及一个整数k,请设计一个算法求出成绩表从小到大排序后的第k个学生的姓名,并列则全部输出。 **输入描述:** 第一行两个正整数,n和k 然后后n行,每行两个整数,分别代表每个学生的姓名和成绩 **输出描述:** 所有排名倒数第k的学生信息,多个学生时按其输入时的顺序输出,中间以`,`分隔。 **输入样例:** 5 3 小红 87.2 小白 92 小橙 99.3 小绿 87 小蓝 89 **输出样例:** 小蓝
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义了一个名为Student的结构体,包含学生姓名和分数两个成员变量
typedef struct {
char name[100];
float score;
} Student;
// 声明函数find_kth_student,用于递归地找到并返回具有第k小分数的学生姓名数组
char** find_kth_student(Student* scores, int n, int k);
int main() {
int n, k;
scanf("%d %d", &n, &k);
getchar();
// 动态分配存储n个学生信息的内存空间
Student* scores = (Student*)malloc(n * sizeof(Student));
for (int i = 0; i < n; i++) {
scanf("%s %f", scores[i].name, &scores[i].score);
}
// 调用find_kth_student函数来获取具有第k小分数的学生姓名数组
char** result = find_kth_student(scores, n, k);
for (int i = 0; result[i] != NULL; i++) {
printf("%s", result[i]);
if (result[i+1] != NULL) {
printf(",");
}
}
for (int i = 0; result[i] != NULL; i++) {
free(result[i]);
}
free(result);
free(scores);
return 0;
}
// 递归方式实现了查找第k小分数的学生姓名的功能
char** find_kth_student(Student* scores, int n, int k) {
if (n <= 0) {//如果输入数组大小n为非正数,返回一个空的字符串数组,表示没有学生数据
char** result = (char**)malloc(sizeof(char*));
result[0] = NULL;
return result;
}
Student pivot = scores[0];//将数组分为小于、等于和大于基准分数pivot.score的三个子数组,并分别对它们进行递归调用
int smaller_count = 0, equal_count = 0, larger_count = 0;
for (int i = 0; i < n; i++) {
if (scores[i].score < pivot.score) {
smaller_count++;
} else if (scores[i].score == pivot.score) {
equal_count++;
} else {
larger_count++;
}
}
Student* smaller = (Student*)malloc(smaller_count * sizeof(Student));//个列表长度
Student* equal = (Student*)malloc(equal_count * sizeof(Student));
Student* larger = (Student*)malloc(larger_count * sizeof(Student));
int s_idx = 0, e_idx = 0, l_idx = 0;
for (int i = 0; i < n; i++) {//分组比较
if (scores[i].score < pivot.score) {
smaller[s_idx++] = scores[i];
} else if (scores[i].score == pivot.score) {
equal[e_idx++] = scores[i];
} else {
larger[l_idx++] = scores[i];
}
}
char** result;
if (k <= smaller_count) {//看看k在哪个数组里面
result = find_kth_student(smaller, smaller_count, k);
} else if (k <= smaller_count + equal_count) {
result = (char**)malloc((equal_count + 1) * sizeof(char*));
for (int i = 0; i < equal_count; i++) {
result[i] = strdup(equal[i].name);
}
result[equal_count] = NULL;
} else {
result = find_kth_student(larger, larger_count, k - smaller_count - equal_count);
}
free(smaller);
free(equal);
free(larger);
return result;
}