GIS算法基础丨第一周作业

2024-09-05 00:36

本文主要是介绍GIS算法基础丨第一周作业,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题1:最佳工作序列

有N件工作,输入每件工作的费时、最后完成的期限以及工作的价值,试求可能的一个完成工作序列,使得价值和最大。

/*
* GIS算法第一周作业 luo
* 
* 程序功能:有N件工作,输入每件工作的费时、最后完成期限以及工作的价值,
* 试求可能的一个完成工作序列,使价值之和最大。
* 
* luo 2024/9/2 最佳工作序列
* 存在问题:代码样例限制了每件工作费时1天
* 
* luo 2024/9/3 修改程序使得程序需要考虑每件工作所花费的时间
* 存在问题:从最后期限开始安排工作使得前面有些天数并没有安排工作,而原先排在后面但能够完成得工作无法参与排序
* 改进方法:增加一个否有时间间隙的判断,若间隙之和能够安排下工作,则可以将已经安排好的工作提前
* 
* luo 2024/9/4 修改程序改进了昨天存在的问题
*  
*/#define _CRT_SECURE_NO_WARNINGS  
#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h>  #define MAX_DAYS 50 // 最大累积工作时长  typedef struct
{char id;      // 工作代号  int duration; // 费时  int deadline; // 最后期限   int value;    // 价值  
} Job;void profitSort(Job* jobs, int n);            // 用于工作收益效率的降序排序
int findMaxDDL(Job* jobs, int n);             // 用于寻找最晚期限
void printResult(char result[], bool slot[], int n); // 用于打印最佳工作序列结果
void findBestJobScheduling(Job* jobs, int n); // 用于寻找最佳工作序列的函数  int main()
{int n;printf("请输入工作数量: ");if (scanf("%d", &n) != 1 || n <= 0) {printf("输入无效,请输入一个正整数。\n");return 1;}Job* jobs = (Job*)malloc(n * sizeof(Job));if (jobs == NULL){printf("内存分配失败。\n");return 1;}for (int i = 0; i < n; i++){printf("请输入第%d个工作的代号、费时、最后期限以及价值:\n", i + 1);if (scanf(" %c %d %d %d", &jobs[i].id, &jobs[i].duration, &jobs[i].deadline, &jobs[i].value) != 4){printf("输入格式错误。\n");free(jobs);return 1;}}findBestJobScheduling(jobs, n);free(jobs);return 0;
}void profitSort(Job* jobs, int n)
{for (int i = 0; i < n - 1; i++){for (int j = 0; j < n - 1 - i; j++){double profitA = (double)jobs[j].value / jobs[j].deadline;double profitB = (double)jobs[j + 1].value / jobs[j + 1].deadline;if (profitA < profitB){Job temp = jobs[j];jobs[j] = jobs[j + 1];jobs[j + 1] = temp;}}}
}int findMaxDDL(Job* jobs, int n)
{int maxDDL=jobs[0].deadline;for (int i = 1; i < n; i++){if (jobs[i].deadline > maxDDL){maxDDL = jobs[i].deadline;}}return maxDDL;
}void printResult(char result[], bool slot[], int n)
{printf("最佳工作序列为:");for (int i = 0; i < n; i++){if (result[i] != result[i + 1] || result[i + 1] == 0){printf("%c ", result[i]);}}
}void findBestJobScheduling(Job* jobs, int n)
{// 1、按工作的profit进行升序排序(冒泡排序)profitSort(jobs, n);// 2、找到最晚期限int max_DDL = findMaxDDL(jobs, n);char result[MAX_DAYS] = { 0 };     // 用于存储工作序列结果  bool slot[MAX_DAYS] = { false };   // 用于标记特定日期是否有工作安排int value_sum = 0;                 // 用于记录最终的价值之和// 3、寻找最佳工作序列   for (int i = 0; i < n; i++){int record = 0;     //计算第i个工作最后期限前有多少天为空for (int j = jobs[i].deadline - 1; j >= 0 && slot[j] == false; j--){record++;}if (record >= jobs[i].duration)  // 若空出的天数足够用于安排工作{for (int k = jobs[i].deadline - 1; k >= jobs[i].deadline - jobs[i].duration; k--){result[k] = jobs[i].id;slot[k] = true;}value_sum += jobs[i].value;}else                             // 若当前期限前空出天数无法安排工作{//记录ddl前空余的天数int valible_days = 0;for (int k = 0; k <jobs[i].deadline; k++){if (slot[k] == false){valible_days++;}}if (valible_days >= jobs[i].duration)  // 若空余天数能安排下该工作  {int daysMoved = 0;// 将之前安排的工作提前  for (int k = 0; k < jobs[i].deadline; k++){while(slot[k] == false && daysMoved < jobs[i].duration)  // 若当前时间空余则将之后的工作往前{for (int pos = k; pos < jobs[i].deadline; pos++){result[pos] = result[pos + 1];slot[pos] = slot[pos + 1];}daysMoved++;}}//将新的工作安排在ddl之前for (int k = jobs[i].deadline - 1; k >= jobs[i].deadline - jobs[i].duration; k--){result[k] = jobs[i].id;slot[k] = true;}value_sum += jobs[i].value;}}}// 4、输出结果  printf("\n");printResult(result, slot, max_DDL);printf("\n");printf("最终价值总和为%d", value_sum);}

问题2:最长路径问题

现有一个nxn大小的格网,其中有些格子无法走通,已知出发点为(0,0),问在这个格网中从起点开始直到边界走过的最长路径(格子数)为多少?
要求:
①不能走回头路,格子不重复
②前进方向为上、下、左、右,不能斜着走

这篇关于GIS算法基础丨第一周作业的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137478

相关文章

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据