当前位置: 首页 > news >正文

贪心算法——赶作业(C++)

慢慢来,沉稳一点。

2024年6月18日


题目描述

        A同学有n份作业要做,每份作业有一个最后期限,如果在最后期限后交作业就会扣分,现在假设完成每份作业都需要一天。A同学想安排作业顺序,把扣分降到最低,请帮他实现。

输入格式

        包含t个测试用例,第一行是单个整数t。每个测试用例以一个正整数n开头,表示作业的数量,然后是两行;第一行包含n个整数,表示作业的截至日期;下一行包含n个整数,表示作业未完成需要扣的分数。

输出格式

        输出扣的最少分数即可。

输入样例:

2

3

3  3  3

10  5  1

7

1 4 6 4 2 4 3

3 2 1 7 6 5 4

输出样例:

0

5


题解思路

        贪心法——带惩罚的调度问题

        利用贪心思想,想让扣的分最低,肯定是先做那些扣分最多的作业,尽可能地保持剩下的作业即使没能完成也可以让扣的分最小化,那第一步就是对作业按扣的分数从大到小排序了,那下一步干什么呢?是不是需要确定做作业的顺序了。

        如果你觉得有疑问,不是已经按惩罚大小排序了吗,那先把惩罚最大的做完不就行了?

        NO!!!

        如果你是学生,你一般来说都是什么时候完成作业的呢?

        欸,知道了吧,是不是deadline呢?就算扣分很大,我们依然保持在最后一天能做完就行了。

        贪心的关键就在这:在排序完之后,我们每次都在截至时间或者靠近截至时间的某个时间完成作业就OK了,这样既能保证扣分大的作业顺利完成,扣分小的作业也能尽可能的完成了。


以上面的第个例子为例:

作业截至:1 4 6 4 2 4 3

惩罚分数:3 2 1 7 6 5 4

1. 按惩罚分数排序得到:

作业截至:4 2 4 3 1 4 6

惩罚分数:7 6 5 4 3 2 1

2. 下面用i表示当前的作业,days数组用于记录那一天做哪一样作业(days初始化为false),ans表示扣分(初始化为0):

  • i = 0时,其截至时间为4,选择在第4天完成该作业,days[4] = true,不用惩罚,ans = 0;
  • i = 1时,其截至时间为2,选择在第2天完成该作业,days[2] = true,不用惩罚,ans = 0;
  • i = 2时,其截至时间为4,第4天已经规划做作业0了,那就提前一天,选择在第3天完成该作业,days[3] = true,不用惩罚,ans = 0;
  • i = 3时,其截至时间为3,第3天已经规划做作业2了,如果提前一天,第二天同样也安排了做作业1,那就提前两天,days[1] = true,不用惩罚,ans = 0;
  • i = 4时,其截至时间为1,从前面看来前四天都安排了任务,尽可能地做扣分大的了,那么当前就不能完成该作业了,需要惩罚,ans = 3;
  • i = 5时,其截至时间为4,和作业4相同情况,没有可以安排的时间了,需要惩罚,ans = 3+2 = 5;
  • i = 6时,其截至时间为6,选择在第6天完成该作业,days[6] = true,不用惩罚,ans = 5;

代码实现

1. 定义homework结构体,在结构体里面重载函数完成排序;

struct homework{int deadline;int punish;homework(int deadline, int punish):deadline(deadline), punish(punish) {}bool operator<(const homework &s) const{return punish >= s.punish;}
};

2. 定义贪心函数getMinLoss;

int getMinLoss(vector<homework> &v){sort(v.begin(), v.end());int ans = 0;int flag[100];//确保足够长的时间int len = v.size();memset(flag, 0, sizeof(flag));//将flag定义成vector初始化为0也行for(int i = 0; i < len; i++){if(flag[v[i].deadline] == 0){flag[v[i].deadline] = 1;}else{int tmp = v[i].deadline;while(flag[tmp]){tmp--;}if(tmp == 0){ans += v[i].punish;}else{flag[tmp] = 1;}}}return ans;
}

3. 完整代码如下:

// 带惩罚的调度问题#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>using namespace std;struct homework{int deadline;int punish;homework(int deadline, int punish):deadline(deadline), punish(punish) {}bool operator<(const homework &s) const{return punish >= s.punish;}
};int getMinLoss(vector<homework> &v){sort(v.begin(), v.end());int ans = 0;int flag[100];int len = v.size();memset(flag, 0, sizeof(flag));for(int i = 0; i < len; i++){if(flag[v[i].deadline] == 0){flag[v[i].deadline] = 1;}else{int tmp = v[i].deadline;while(flag[tmp]){tmp--;}if(tmp == 0){ans += v[i].punish;}else{flag[tmp] = 1;}}}return ans;
}int main(){cout<<"开始输入数据!!!";int t;cin>>t;vector<int> res;for(int i = 0; i < t; i++){int n;cin>>n;vector<homework> v;vector<int> Deadline;vector<int> Punish;// 输入数据for(int i = 0; i < n; i++){int deadline;cin>>deadline;Deadline.emplace_back(deadline);}for(int i = 0; i < n; i++){int punish;cin>>punish;Punish.emplace_back(punish);}// 初始化homeworkfor(int i = 0; i < n; i++){v.emplace_back(homework(Deadline[i], Punish[i]));}// 将每次的结果插入结果集res.emplace_back(getMinLoss(v));}// 打印结果int count = 1;for(auto e:res){cout<<"第"<<count<<"次最少扣"<<e<<"分"<<endl;count++;}return 0;
}// 2
// 3
// 3 3 3
// 10 5 1
// 7
// 1 4 6 4 2 4 3
// 3 2 1 7 6 5 4
// 0
// 5

4. 运行结果

相关文章:

贪心算法——赶作业(C++)

慢慢来&#xff0c;沉稳一点。 2024年6月18日 题目描述 A同学有n份作业要做&#xff0c;每份作业有一个最后期限&#xff0c;如果在最后期限后交作业就会扣分&#xff0c;现在假设完成每份作业都需要一天。A同学想安排作业顺序&#xff0c;把扣分降到最低&#xff0c;请帮他实…...

Python 数据可视化 多色散点图

Python 数据可视化 多色散点图 fig, ax plt.subplots() max_line max([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) min_line min([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) ax.plot([min_line, max_line], [min_line, …...

C语言入门系列:数据类型之浮点数

文章目录 一&#xff0c;什么是浮点数二&#xff0c;C语言中的浮点数1&#xff0c;float1.1 float的声明1.2 float的存储格式1.3 float的精度和范围 2&#xff0c;double2.1 double变量的声明2.2 double的存储格式1.3 double的精度和范围1.4 long double 3&#xff0c;0.2 0.1…...

思科配置路由器,四台主机互相ping通

一、如图配置 PC4和PC5用来配置路由器&#xff0c;各ip、接口如图所示。 二、配置各主机ip、子网掩码SNM、默认网关DGW (一)、PC0 (二)、PC1 (三)、PC2 (四)、PC3 三、 配置路由器Router0 (期间报错是打错了字母) Router>en Router#configure terminal Enter configurat…...

个人博客测试用例设计

个人博客测试用例设计 个人博客测试用例 分别从功能、性能、安全、兼容及界面分别展开 个人博客测试用例...

Java输入输出语句 和 保留字

目录 键盘输入语句 保留字 键盘输入语句 Input.java , 需要一个 扫描器(对象), 就是Scanner 步骤 &#xff1a; 导入该类的所在包, java.util.*创建该类对象&#xff08;声明变量&#xff09;调用里面的功能 案例要求&#xff1a;可以从控制台接收用户信息&#xff0c;【姓…...

生成对抗网络——GAN深度卷积实现(代码+理解)

本篇博客为 上篇博客的 另一个实现版本&#xff0c;训练流程相同&#xff0c;所以只实现代码&#xff0c;感兴趣可以跳转看一下。 生成对抗网络—GAN&#xff08;代码理解&#xff09; http://t.csdnimg.cn/HDfLOhttp://t.csdnimg.cn/HDfLO 目录 一、GAN深度卷积实现 1. 模型…...

gbase8s数据库阻塞检查点和非阻塞检查点的执行机制

1. 检查点的描述 为了便于数据库系统的复原和逻辑恢复&#xff0c;数据库服务器生成的一致性标志点&#xff0c;称为检查点&#xff0c;其是建立在数据库系统的已知和一致状态时日志中的某个时间点检查点的目的在于定期将逻辑日志中的重新启动点向前移动 如果存在检查点&#…...

ARM32开发--串口库封装(初级)

知不足而奋进望远山而前行 目录 文章目录 前言 目标 内容 开发流程 文件目录创建 分组创建 接口定义 完整代码 总结 前言 在嵌入式软件开发中&#xff0c;封装抽取流程和抽取封装策略是非常重要的技术&#xff0c;能够提高代码的复用性和可维护性。本文将介绍如何在文…...

统一管理:Vue公共组件/公共样式/全局自定义指令

main.js 引入存放公共文件的文件路径 import "./plugins";src/plugins文件夹下的index.js 在处理公共文件中分别引入 /* 公共引入,勿随意修改,修改时需经过确认 */ import Vue from "vue";import "/icons"; // 图标 import ByuiQueryForm fr…...

Linux之旅: 基础知识点的终极指南

文章目录 1、Linux的目录结构2、ls命令3、管理文件和目录4、linux命令使用细节和技巧5、权限管理基本命令6、搜索命令7、管道符与重定向8、压缩和解压命令9、用户及vim编辑器10、用户和用户组管理一、Linux系统用户账号的基本管理二、Linux系统用户组的管理 1、Linux的目录结构…...

C#部分方法有什么用处?和传统方法有什么区别?什么时候用合适?

在C#中&#xff0c;部分类&#xff08;partial class&#xff09;和部分方法&#xff08;partial method&#xff09;是两个不同的概念&#xff0c;但它们经常一起使用&#xff0c;特别是在代码生成和框架设计中。下面我将分别解释这两个概念&#xff0c;并讨论它们的用处、与传…...

elasticsearch hanlp插件远程词典配置

elasticsearch hanlp插件远程词典配置 背景远程词典配置新增远程词典文件修改hanlp-remote.xml自动加载词典 远程词典测试 背景 在使用elasticsearch的过程中&#xff0c;总会遇到与分词相关的需求&#xff0c;这里将针对常用的elasticsearch hanlp&#xff08;后面统称为 es …...

力扣每日一题 6/18 字符串/模拟

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2288.价格减免 【中等】 题目&#xff1a; 句子 是由若干个单词组成的字符…...

架构设计 - Nginx Proxy Cache 缓存配置

摘要&#xff1a; web 应用业务缓存通常3级&#xff1a; 一级缓存&#xff1a;JVM 本地缓存 二级缓存&#xff1a;Redis集中式缓存 三级缓存&#xff1a;Nginx Proxy Cache 缓存 或 Nginx Lua 缓存 四级缓存&#xff1a;静态资源CDN缓存 本文主要分享 Nginx Proxy Cache 缓…...

【前端】HTML5基础

目录 0 参考1 网页1.1 什么是网页1.2 什么是HTML1.3 网页的形成 2 浏览器2.1 常用的浏览器2.2 浏览器内核 3 Web标准3.1 为什么需要Web标准3.2 Web标准的构成 4 HTML 标签4.1 HTML语法规范4.1.1 基本语法概述4.1.2 标签关系4.1.2.1 包含关系4.1.2.2 并列关系 4.2 HTML基本结构标…...

9个最佳性能测试工具(2024)

1、前言 性能测试检查软件程序在预期工作负载下的速度、响应时间、可靠性、资源使用情况和可扩展性。性能测试的目的不是发现功能缺陷&#xff0c;而是消除软件或设备中的性能瓶颈。 性能测试为利益相关者提供有关其应用程序的速度、稳定性和可扩展性的信息。更重要的是&…...

RTthread+STM32F407ZGTx+烟雾报警检测+蜂鸣器报警+LED闪烁||使用RTthread Studio

目录 实验背景 1.安装环境 2.配置环境 3.先编译下载实例程序2&#xff0c;观察DS0是否闪烁 4.实验方法 5.实例代码 6.硬件连接 7.实验效果 8.关于这次开发遇到的问题 1.反应慢&#xff0c;都熄灭1分钟多了&#xff0c;才报的问题&#xff1f; 2.关于rt_pin_mode(KEY…...

k8s资源的基本操作

文章目录 一、Namespace1、概述2、预定义的k8s命名空间2.1、default2.2、kube-public2.3、kube-system2.4、kube-node-lease 3、命名空间基本操作3.1、查看3.1.1、查看所有的命名空间3.1.2、查看指定的命名空间3.1.3、指定输出格式3.1.4、查看ns详情 3.2、创建3.2.1、命令行创建…...

19.面包屑导航制作

面包屑导航制作 官网&#xff1a;组件 | Element 1. 在layout下新建BreadCrumb.vue BreadCrumb.vue <template><div class"bread-text"><el-breadcrumb class"bred"separator"/"><el-breadcrumb-item v-for"item in…...

做动画?Animatediff 和 ComfyUI 更配哦!

如果从工作流和内存利用率的角度来说&#xff0c;Animatediff 和 ComfyUI 可能更配一些&#xff0c;毕竟制作动画是一个很吃内存的操作。 首先&#xff0c;我们需要在管理器中下载 Animatediff 插件&#xff0c;当然也可以直接导入听雨的工作流&#xff0c;然后在管理器的安装…...

笔记-python里面的xlrd模块详解

那我就一下面积个问题对xlrd模块进行学习一下&#xff1a; 1.什么是xlrd模块&#xff1f; 2.为什么使用xlrd模块&#xff1f; 3.怎样使用xlrd模块&#xff1f; 1.什么是xlrd模块&#xff1f; ♦python操作excel主要用到xlrd和xlwt这两个库&#xff0c;即xlrd是读excel&…...

oracle将字符串中的字符和数字拆分开等功能

将字符串中的字符和数字拆分开 create or replace procedure F_GetNumber1( inString IN VARCHAR2,n_return1 out varchar2, n_return2 out varchar2) ISDCHAR VARCHAR2(1024); OUTCHAR VARCHAR2(1024); j number default 0; ulen number; BEGINOUTCHAR:;DCHAR:TRIM(inStr…...

汇编基础之使用vscode写hello world

汇编语言&#xff08;Assembly Language&#xff09; 概述 汇编语言&#xff08;Assembly Language&#xff09;是一种低级编程语言&#xff0c;它直接对应于计算机的机器代码&#xff08;machine code&#xff09;&#xff0c;但使用了更易读的文本符号。每台个人计算机都有…...

APS计划排程系统如何打破装备使用约束

APS计划排程系统是离散制造型企业在计划控制方向的重要支撑&#xff0c;它提供的是交期预测、订单排产计划、物料采购计划、人力分配计划等等。近些几年来&#xff0c;多品种、小批量、多订单的生产模式&#xff0c;让企业的计划员应接不暇、疲累不堪&#xff0c;传统的人工经验…...

gigachad - suid

gigachadeasyftp利用、google反图搜索、 suid提权、s-nail 提权 主机发现 ┌──(kali㉿kali)-[~/桌面/OSCP] └─$ sudo netdiscover -i eth0 -r 192.168.44.138/24服务探测 ┌──(kali㉿kali)-[~/桌面/OSCP] └─$ sudo nmap -sV -A -T 4 -p- 192.168.44.138 |_/kingchad…...

QtScript模块

在Qt中&#xff0c;可以使用Qt Script模块来将C类和方法绑定到Qt脚本引擎中&#xff0c;从而使得可以在Qt脚本中调用这些C类和方法。以下是一个简单的示例&#xff0c;演示了如何在Qt中将C类暴露给Qt Script引擎&#xff1a; 假设有一个名为 MyClass 的C类&#xff0c;其头文件…...

qt中for循环不要使用循环中会更改的变量

检查代码&#xff0c;发现始终会少了一位&#xff0c;最后发现我在使用for循环时&#xff0c;懒省事&#xff0c;判断条件中使用的变量是涉及到循环体中更改的变量&#xff0c;代码如下&#xff0c;更直观 for (int i 0; i < m_images.size(); i) {packageToDBList[0].imag…...

spark独立集群搭建

spark独立集群搭建(不依赖Hadoop) 1、上传spark-2.4.5-bin-hadoop2.7.tgz至 /usr/local/moudel &#xff0c;再解压到 /usr/local/soft tar -zxvf spark-2.4.5-bin-hadoop2.7.tgz -C /usr/local/soft/ 重命名 mv spark-2.4.5-bin-hadoop2.7/ spark-2.4.5 配…...

【BFS算法】广度搜索·由起点开始逐层向周围扩散求得最短路径(算法框架+题目)

0、前言 深度优先搜索是DFS&#xff08;Depth Frst Search)&#xff0c;其实就是前面所讲过的回溯算法&#xff0c;它的特点和它的名字一样&#xff0c;首先在一条路径上不断往下&#xff08;深度&#xff09;遍历&#xff0c;获得答案之后再返回&#xff0c;再继续往下遍历。…...

做100个网站效果/优秀的网络搜索引擎营销案例

Array class1. introduceRuby的Array类和其他的不太一样, Ruby中允许一个Array对象中存储不同类型的元素. 例如 : class Myclass end my1 Myclass.new a1 Array.new([1,"Digoal",[1,2,3,4,5],4,my1]) p a1 执行结果 : [1, "Digoal", [1, 2, 3, 4, 5], 4,…...

产品推广方案有哪些/金华百度seo

在开发项目时&#xff0c;对EditText 做了OnKey事件的监听 &#xff0c;但总是会触发两次&#xff01; 后来查阅很多资料后发现&#xff0c;Key有Down和Up事件&#xff0c;所以会执行两次。 解决方法&#xff1a;捕获UP 或DWON的其中一种 etTMH.setOnKeyListener(new OnKey…...

wordpress网站怎么建设/随州seo

jvm的垃圾收集器分为新生代和老年代的收集器&#xff0c;使用的算法不一样 新生代采用复制算法&#xff0c;就是保留一个eden区&#xff0c;两个survivor区&#xff0c;默认是8:1:1 当eden区满了&#xff0c;就执行minorGC将对象回收&#xff0c;幸存的对象就被复制到to surviv…...

天津 网站建设/企业网站设计素材

观自在菩萨&#xff0c;行深般若波罗蜜多时&#xff0c;照见五蕴皆空&#xff0c;度一切苦厄。舍利子&#xff0c;色不异空&#xff0c;空不异色&#xff0c;色即是空&#xff0c;空即是色。受想行识&#xff0c;亦复如是。舍利子&#xff0c;是诸法空相&#xff0c;不生不灭&a…...

高端模板网站建设/百度网页版怎么切换

把列表中的正数和负数分开排列. lst [1, -2, 10, -11, 123, -124] lst.sort(keylambda x: (x < 0, abs(x))) print(lst) [1, 10, 123, -2, -11, -124] 把多维列表转为一维列表 list_1 [[1, 2], [3, 4, 5], [6, 7], [8], [9]] # function 1 print([i for k in list_1 for i…...

新增网站 备案/指数基金排名前十名

文/SanDisk闪迪中国区企业销售总经理_陈煜琦 随着企业、服务提供商和超大型数据中心从描述性分析向预测性和规范性分析演进&#xff0c;结合了融合运营和分析数据管道的融合数据平台变得日益重要。大数据闪存可让数据处理平台快速访问历史数据和实时数据流&#xff0c;从而以较…...