贪心算法——赶作业(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. 运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易备防勒索备份方案与成功案例

随着信息化的发展&#xff0c;数据安全的重要性愈加突出。据 Hiscox 全球网络安全统计&#xff0c;在勒索软件攻击事件当中&#xff0c;64%以上的用户是中小企业。因此&#xff0c;制定完善的灾备策略&#xff0c;是抵御网络威胁的终极方案。而在诸多数据备份方案中&#xff0c…

【Linux】进程控制1——进程创建和进程终止

1.进程创建 1.1.再谈fork 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void);//pid_t为整形 返回值&#xff1a;子进程中的fork()返回0&#xff…

内置类型不够用?试试Python内置类型子类化!

目录 1、经典继承法:直接子类化内置类型 🧬 1.1 了解Python内置类型 1.2 实现子类化的基础步骤 步骤1:定义子类 步骤2:添加自定义行为 步骤3:使用子类 1.3 实战:子类化列表list示例 1.4 优化:重写魔法方法实现自定义行为 2、高级技巧:元类介入定制 🪐 2.1 …

TCP/IP协议,三次握手,四次挥手,常用的协议

IP - 网际协议 IP 负责计算机之间的通信。 IP 负责在因特网上发送和接收数据包。 HTTP - 超文本传输协议 HTTP 负责 web 服务器与 web 浏览器之间的通信。 HTTP 用于从 web 客户端&#xff08;浏览器&#xff09;向 web 服务器发送请求&#xff0c;并从 web 服务器向 web …

智能门锁电池双节升压充电芯片-FP6291支持5V1A输入升压 8.4V双节电池充电

方案背景 可充电锂电池是一种环保、高效的智能锁电池类型&#xff0c;其主要优点是可以循环充电使用、容量大、使用寿命长。与一次性电池相比&#xff0c;可充电锂电池可以循环充电使用&#xff0c;减少了废弃物的产生和对环境的影响。同时&#xff0c;可充电锂电池的容量较大…

细说MCU输出互补型PWM波形的实现方法

目录 一、硬件及工程 二、建立工程 1、TIM1引脚 2、建立工程 &#xff08;1&#xff09;配置GPIO &#xff08;2&#xff09;选择时钟源和Debug模式 &#xff08;3&#xff09;配置定时器 &#xff08;4&#xff09;配置中断 &#xff08;5&#xff09;配置系统时钟 …

怎么去避免手机赚钱的骗局?

要避免手机赚钱的骗局&#xff0c;可以遵循以下一些建议&#xff1a; 1. 谨慎对待高收益承诺&#xff1a;如果一个项目承诺轻松获取高额回报&#xff0c;那么很可能存在风险。真正的高收益往往伴随着高风险&#xff0c;而且需要付出大量的努力和时间。 2. 调查了解相关项目&am…

【基因功能富集2:分析流程】非模式生物怎么注释 clusterProfiler包GO、KEGG

文章目录 概要整体流程step1 百度搜索注释物种--拉丁文名称step2 注释官网搜索--该物种对应库--编号step3 正常注释 即可 概要 不常见的物种如何进行富集分析&#xff1f;&#xff1f; 整体流程 提示&#xff1a; step1 百度搜索注释物种–拉丁文名称 提示&#xff1a;拉丁文…

Gobject tutorial 六

Instantiatable classed types Initialization and destruction 类型的实例化是通过函数g_tpye_create_instance()实现的。这个函数首先会查找与类型相关的GTypeInfo结构体&#xff0c;之后&#xff0c;查询结构体中的instance_size和 instance policy即 n_preallocs(在 2.10版…

MySQL数据库管理 二

1、数据表高级操作 &#xff08;1&#xff09;克隆表 方法一&#xff1a; create table 新表名 like 旧表名; #克隆表结构 insert into 新表名 select * from 旧表名; #克隆表数据 #此方法能保证 新表的表结构、表数据 跟旧表都是一致的 方法二&#x…

ECharts 词云案例三:2024年阅读关键词

ECharts 词云案例三&#xff1a;2024年阅读关键词 引言 在数据可视化领域&#xff0c;ECharts 以其强大的功能性和灵活性&#xff0c;成为开发者和设计师的首选工具之一。继上一篇关于 ECharts 词云图的详细介绍后&#xff0c;本文将探索词云图的进阶应用——使用蒙版来创造更…

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…

家人们,我最近迷上了食家巷的方形饼

那独特的方形造型&#xff0c;超级可爱。&#x1f44f;刚出炉的方形饼&#xff0c;热气腾腾&#xff0c;散发着诱人的香气。&#x1f60b;咬一口&#xff0c;酥脆的外皮“咔滋”作响&#xff0c;里面的面饼却又十分绵软&#xff0c;口感层次超丰富&#xff01;&#x1f929;无论…

Golang | Leetcode Golang题解之第144题二叉树的前序遍历

题目&#xff1a; 题解&#xff1a; func preorderTraversal(root *TreeNode) (vals []int) {var p1, p2 *TreeNode root, nilfor p1 ! nil {p2 p1.Leftif p2 ! nil {for p2.Right ! nil && p2.Right ! p1 {p2 p2.Right}if p2.Right nil {vals append(vals, p1.V…

iview 组件里面的(任何一个月)整月日期全部选中_iview时间轴选中有历史记录日期

iview 组件里面的整月日期全部选中&#xff1a; ①&#xff1a;第一种是当前月的日期全部选中&#xff1a; 先上效果图&#xff1a;当前月分 获取到的值&#xff1a; 当前月的方法&#xff1a; // getDateStr() {// var curDate new Date();// var curMonth curDate.ge…

每日一题——Python代码实现力扣58. 最后一个单词的长度(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码逻辑&#xff1a; 时间复杂度&#xff1a; 空间复杂度&#xff1a; …

HTML5休闲小游戏《城堡守卫传说》源码,引流、刷广告利器

HTML5休闲小游戏《城堡守卫传说》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods467802.html

成都百洲文化传媒有限公司助力商家扬帆远航

在数字经济的浪潮中&#xff0c;电商行业如日中天&#xff0c;成都百洲文化传媒有限公司正是这一领域的佼佼者。作为一家专注于电商服务的传媒公司&#xff0c;百洲文化以其专业的服务、创新的理念和卓越的成果&#xff0c;在业内树立了良好的口碑&#xff0c;成为众多商家信赖…

划分子网和构造超网的学习

子网掩码长度&#xff1d;32位 某位&#xff1d;1&#xff1a;IP地址中的对应位为网络号和子网号 某位&#xff1d;0&#xff1a;IP地址中的对应位为主机号 从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。 使用子网掩码(subnet mask)可…

Python大数据-电商商品详情数据分析【JD电商平台为例】

一、项目背景 网上购物已经成为大众生活的重要组成部分。人们在电商平台上浏览商品并购物&#xff0c;产生了海量的用户行为数据&#xff0c;用户对商品的详情数据对商家具有重要的意义。利用好这些碎片化、非结构化的数据&#xff0c;将有利于企业在电商平台上的持续发展&…