发布时间:2026/7/17 9:51:00
Kimi    LeetCode 3594. 所有人渡河所需的最短时间 C语言实现 LeetCode 3594. 所有人渡河所需的最短时间 — C 语言实现题目分析这道题是一个状态空间最短路问题。由于人可以来回摆渡状态存在循环无法用普通 DP必须用 Dijkstra 算法。状态定义 (people_mask, dir, stage)- people_mask二进制位为 1 表示该人还在起点营地- dir0 船在起点1 船在对岸- stage当前环境阶段索引0m-1C 语言实现要点C 没有内置优先队列需要手动实现 二叉堆Min-Heapc#include stdio.h#include stdlib.h#include math.h#include string.h#include float.htypedef struct {double cost;int people; // bitmask: 1 means still at start campint dir; // 0 boat at start, 1 boat at destinationint stage; // current stage index} State;// Min-Heap implementationtypedef struct {State *data;int size;int capacity;} MinHeap;MinHeap* createHeap(int capacity) {MinHeap *heap (MinHeap*)malloc(sizeof(MinHeap));heap-data (State*)malloc(sizeof(State) * capacity);heap-size 0;heap-capacity capacity;return heap;}void swap(State *a, State *b) {State tmp *a;*a *b;*b tmp;}void pushHeap(MinHeap *heap, State s) {if (heap-size heap-capacity) {heap-capacity * 2;heap-data (State*)realloc(heap-data, sizeof(State) * heap-capacity);}int i heap-size;heap-data[i] s;// sift upwhile (i 0) {int parent (i - 1) / 2;if (heap-data[parent].cost heap-data[i].cost) break;swap(heap-data[parent], heap-data[i]);i parent;}}State popHeap(MinHeap *heap) {State ret heap-data[0];heap-data[0] heap-data[--heap-size];// sift downint i 0;while (1) {int left 2 * i 1;int right 2 * i 2;int smallest i;if (left heap-size heap-data[left].cost heap-data[smallest].cost)smallest left;if (right heap-size heap-data[right].cost heap-data[smallest].cost)smallest right;if (smallest i) break;swap(heap-data[i], heap-data[smallest]);i smallest;}return ret;}int isEmpty(MinHeap *heap) {return heap-size 0;}void freeHeap(MinHeap *heap) {free(heap-data);free(heap);}// Precompute max_time for each subsetvoid precomputeMaxTime(int n, int *time, double *max_time) {int total 1 n;max_time[0] 0.0;for (int mask 1; mask total; mask) {int mx 0;for (int i 0; i n; i) {if (mask (1 i)) {if (time[i] mx) mx time[i];}}max_time[mask] (double)mx;}}// Precompute valid subsets (at most k people) for each settypedef struct {int **valid_subsets;int *count;int *capacity;} ValidSubsets;ValidSubsets* precomputeValidSubsets(int n, int k) {int total 1 n;ValidSubsets *vs (ValidSubsets*)malloc(sizeof(ValidSubsets));vs-valid_subsets (int**)malloc(sizeof(int*) * total);vs-count (int*)calloc(total, sizeof(int));vs-capacity (int*)malloc(sizeof(int) * total);for (int ppl 0; ppl total; ppl) {vs-capacity[ppl] 4;vs-valid_subsets[ppl] (int*)malloc(sizeof(int) * vs-capacity[ppl]);// Enumerate all subsets of pplint sub ppl;while (1) {int bits 0;int tmp sub;while (tmp) {bits tmp 1;tmp 1;}if (bits k) {if (vs-count[ppl] vs-capacity[ppl]) {vs-capacity[ppl] * 2;vs-valid_subsets[ppl] (int*)realloc(vs-valid_subsets[ppl],sizeof(int) * vs-capacity[ppl]);}vs-valid_subsets[ppl][vs-count[ppl]] sub;}if (sub 0) break;sub (sub - 1) ppl;}}return vs;}void freeValidSubsets(ValidSubsets *vs, int n) {int total 1 n;for (int i 0; i total; i) {free(vs-valid_subsets[i]);}free(vs-valid_subsets);free(vs-count);free(vs-capacity);free(vs);}double minTime(int n, int k, int m, int* time, int timeSize, double* mul, int mulSize) {int full_mask (1 n) - 1;int total_states 1 n;// Precompute max_time for each subsetdouble *max_time (double*)malloc(sizeof(double) * total_states);precomputeMaxTime(n, time, max_time);// Precompute valid subsetsValidSubsets *vs precomputeValidSubsets(n, k);// dist[people_mask][dir][stage]double ***dist (double***)malloc(sizeof(double**) * total_states);for (int i 0; i total_states; i) {dist[i] (double**)malloc(sizeof(double*) * 2);for (int j 0; j 2; j) {dist[i][j] (double*)malloc(sizeof(double) * m);for (int s 0; s m; s) {dist[i][j][s] DBL_MAX;}}}MinHeap *heap createHeap(1024);dist[full_mask][0][0] 0.0;pushHeap(heap, (State){0.0, full_mask, 0, 0});double result -1.0;while (!isEmpty(heap)) {State cur popHeap(heap);int ppl cur.people;int dir cur.dir;int spd cur.stage;if (cur.cost dist[ppl][dir][spd] 1e-9) {continue;}if (dir 1 cur.people 0) {result cur.cost;break;}if (dir 0) {// Boat at start: send a group (at most k people) to destinationfor (int idx 0; idx vs-count[ppl]; idx) {int sub vs-valid_subsets[ppl][idx];if (sub 0) continue;double d max_time[sub] * mul[spd];double new_cost cur.cost d;int new_ppl cur.people ^ sub;int new_spd ((spd (int)floor(d)) % m m) % m;if (new_cost dist[new_ppl][1][new_spd] - 1e-9) {dist[new_ppl][1][new_spd] new_cost;pushHeap(heap, (State){new_cost, new_ppl, 1, new_spd});}}} else {// Boat at destination: send exactly 1 person backint arrived full_mask ^ cur.people;for (int i 0; i n; i) {int mask 1 i;if (arrived mask) {double d max_time[mask] * mul[spd];double new_cost cur.cost d;int new_ppl cur.people | mask;int new_spd ((spd (int)floor(d)) % m m) % m;if (new_cost dist[new_ppl][0][new_spd] - 1e-9) {dist[new_ppl][0][new_spd] new_cost;pushHeap(heap, (State){new_cost, new_ppl, 0, new_spd});}}}}}// CleanupfreeHeap(heap);freeValidSubsets(vs, n);free(max_time);for (int i 0; i total_states; i) {for (int j 0; j 2; j) {free(dist[i][j]);}free(dist[i]);}free(dist);return result;}核心设计组件 说明Min-Heap 手动实现二叉堆支持 push / pop / isEmpty动态扩容max_time[mask] 预处理每个子集的最大 time[i]避免重复计算valid_subsets 预处理每个剩余集合的所有合法子集人数 ≤ k用动态数组存储三维 dist 数组 dist[mask][dir][stage]初始化为 DBL_MAX浮点比较 用 1e-9 容差避免精度问题编译运行bashgcc -o leetcode_3594 leetcode_3594.c -lm./leetcode_3594下载文件: [leetcode_3594.c](sandbox:///mnt/agents/output/leetcode_3594.c)

相关新闻

2026/7/17 9:45:58

AI加速器技术解析:架构、优化与应用实践

1. AI加速器技术背景与核心价值 在ChatGPT等大模型引爆AI革命的今天,传统CPU处理神经网络计算时暴露出明显瓶颈。实测显示,用Intel i9-13900K处理1750亿参数的GPT-3前向推理需要超过1分钟,而专用AI加速器如NVIDIA H100仅需不到3秒。这种千倍级…

2026/7/17 9:45:58

Ubuntu apt镜像源优化配置与国内镜像站推荐

1. Ubuntu apt镜像源更改的必要性 作为Ubuntu系统的核心组件,apt(Advanced Package Tool)是管理软件包的主要工具。默认情况下,Ubuntu会连接官方服务器获取软件更新,但对于国内用户来说,这往往会遇到以下问…

2026/7/17 9:45:58

鸿蒙PC前端开发:CodeArts IDE + Vite + Node重构范式

1. 项目概述:鸿蒙PC不是“换皮Windows”,CodeArts IDE跑Vite前端的本质是重构开发范式 鸿蒙PC上用CodeArts IDE做前端开发,绝不是把Windows那套VS Code Node npm照搬过来就能跑通的事。我从2024年鸿蒙PC开发者预览版开始就在真实设备上反复…

2026/7/17 11:01:09

射频PCB设计中的9个致命错误及解决方案

1. 射频PCB设计的核心挑战在射频电路设计中,PCB走线不再是简单的电气连接,而是传输线系统的重要组成部分。高频信号对走线特性极其敏感,微小的设计失误都可能导致信号完整性严重劣化。我经历过一个典型的案例:在某款2.4GHz无线模块…

2026/7/17 11:01:09

Ascend C lroundf函数文档

lroundf 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/ca…

2026/7/17 11:01:09

饰品连锁管理不用愁!雪兽 Helen 收银系统赋能全域门店

饰品连锁门店的经营,远不止简单的收银结算。作为精致饰品连锁品牌,HelenAllure旗下门店SKU品类繁杂、款式更新快,再加上连锁门店分散布局,日常经营中常常遭遇诸多棘手难题:饰品条码录入繁琐,高峰期收银排队…

2026/7/17 11:01:09

Windows磁盘分区管理:diskpart命令行工具详解

1. Windows磁盘分区管理概述在Windows系统环境中,磁盘分区管理是每位用户都可能遇到的基础操作。无论是新硬盘初始化、系统重装前的分区调整,还是存储空间优化,掌握高效的磁盘管理方法都至关重要。虽然Windows自带的图形化磁盘管理工具&#…

2026/7/17 5:59:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/17 1:21:45

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/17 7:39:19

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/17 0:04:23

BiSheng JDK-build性能调优:构建速度提升30%的优化策略

BiSheng JDK-build性能调优:构建速度提升30%的优化策略 【免费下载链接】bishengjdk-build BiSheng JDK build and test scripts - common across all releases/versions 项目地址: https://gitcode.com/openeuler/bishengjdk-build 前往项目官网免费下载&am…

2026/7/16 13:58:36

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…