网站模板选择培训网站开发怎么样
网站模板选择,培训网站开发怎么样,扬州房产网,做的网站没法本地上传图片题目描述“饱了么”外卖系统中维护着 N 家外卖店#xff0c;编号 1 ~ N。每家外卖店都有一个优先级#xff0c;初始时#xff08;0 时刻#xff09;优先级都为 0。每经过 1 个时间单位#xff0c;如果外卖店没有订单#xff0c;则优先级会减少 1#xff0c;最低减到 0 int id; } Order; // 比较函数先按店铺id排序id相同的按时间排序 int cmp(const void *a, const void *b) { Order *x (Order *)a; Order *y (Order *)b; if (x-id ! y-id) { return x-id - y-id; } return x-time - y-time; } int main() { int N, M, T; scanf(%d %d %d, N, M, T); Order orders[M]; for (int i 0; i M; i) { scanf(%d %d, orders[i].time, orders[i].id); } // 按店铺和时间排序订单 qsort(orders, M, sizeof(Order), cmp); // 初始化每个店铺的状态 int priority[MAX_N] {0}; // 用于计算优先级 int last_time[MAX_N] {0}; // 上一次有订单的时间用于和当前订单时间作差找到要减去的数值 int in_cache[MAX_N] {0}; // 是否在优先缓存中。如果是1就说明在优先缓存中初始化为0因为一开始肯定没在优先缓存中 int result 0;//用于输出最后结果 int idx 0; // 当前处理的订单索引 //订单索引就是订单的下标。共有M条订单所以条件就是idxM。 // 遍历每个店铺。一个店铺一个店铺的遍历完全处理完一个店铺之后即找到该店铺是否在缓存中后再遍历其他店铺。 for (int id 1; id N; id) { // 处理该店铺即店铺1的所有订单 //while循环的条件就是判断是否是店铺1是店铺1才进行下面操作。 while (idx M orders[idx].id id) { int ts orders[idx].time;//当前的时刻赋值给ts。 // 计算从上一次订单到这次订单之间减少的优先级 if (last_time[id] ! ts) { priority[id] - (ts - last_time[id] - 1); if (priority[id] 0) priority[id] 0; } // 检查是否要移出缓存 if (in_cache[id] priority[id] 3) { in_cache[id] 0;//表示不在优先缓存里边 } // 处理当前订单 priority[id] 2; last_time[id] ts;//当前时间处理完成下一次进行的时候就变成上一时刻了。 // 检查是否要加入缓存 if (priority[id] 5) { in_cache[id] 1; } idx;//不断加1直到处理完该店铺的所有订单 } // 处理从最后一次订单到T时刻的优先级减少 //避免出现最后一次时刻不在样例输入中但店铺还是要减优先级的情况。最后再进行一次缓存判断输出结果。 if (last_time[id] T) { priority[id] - (T - last_time[id]); if (priority[id] 0) priority[id] 0; if (in_cache[id] priority[id] 3) { in_cache[id] 0; } } // 统计结果 if (in_cache[id]) { result; } } printf(%d\n, result); return 0; }int cmp(const void *a, const void *b) { Order *x (Order *)a; Order *y (Order *)b; if (x-id ! y-id) { return x-id - y-id;//先按店铺id升序 } return x-time - y-time;//id相同按时间排序 }上述代码是快速排序下面详细解析一下Order *x (Order *)a; // 将void指针转换为Order指针转换(Order *)a告诉编译器把a当作指向Order的指针使用现在x是Order *可以用x-id访问成员注意上述排序顺序。一开始我以为只需要进行时刻排序但发现反正还要进行优先级减法所以都一样。怎样保证是升序还是降序呢升序小在前返回0返回0return a - b降序大在前返回0返回0return b - a对于升序比较函数return a-b情况返回值含义升序视角排序结果a b负数a比b小应该在前a在b前a b零a和b相等顺序不确定a b正数a比b大应该在后b在a前对于降序比较函数return b-a情况返回值含义降序视角排序结果a b负数a比b大应该在前a在b前a b零a和b相等顺序不确定a b正数a比b小应该在后b在a前例子数字 3 和 5情况1升序比较函数int cmp_asc(const void *a, const void *b) { int x *(int *)a; // 假设 a3, b5 int y *(int *)b; return x - y; // 3-5 -2 0 }返回负数-2指令把 3 放在 5 前面结果3, 5升序情况2降序比较函数int cmp_desc(const void *a, const void *b) { int x *(int *)a; // 假设 a3, b5 int y *(int *)b; return y - x; // 5-3 2 0 }返回正数2指令把 3 放在 5 后面结果5, 3降序