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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int