头歌实践平台 数据结构与算法课程设计

易 - 青蛙跳台阶

题目:易 - 青蛙跳台阶

描述:从前有一只青蛙想跳台阶去等峰,若该青蛙一次可以跳上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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值