【刷题篇】贪心算法(二)

news2024/11/26 4:42:57

文章目录

  • 找出工作所需最短时间
  • 活动选择
  • 无重叠区间

找出工作所需最短时间

某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的最短时间
第一行T(1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数n,m(1<=n<=10000,1<=m<=100),接下来的一行是n个整数ti (1<=t<=100)。

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

//n个工作时间是n[i],m台机器所需最短时间

struct myclass {
	bool operator() (int i, int j) { return (i < j); }
} myobject;

int besttimes(vector<int>& works,int m)
{
	//如果工作件数少于机器数据量的话,就直接取单个工作的最大时间
	int numworks = works.size();
	//将数组进行排序
	sort(works.begin(), works.end(), myobject);

	int* machine = new int[m]{0};
	if (numworks <= m)
	{
		return works[numworks-1];
	}
	else
	{
		//分配机器,找最先结束工作的,升序所以要使用大到小
		for (int i = numworks - 1; i >= 0; i--)
		{   //这里记录一下
			int finish = 0;
			int machinetimes = machine[finish];
			for (int j = 0; j < m; j++)
			{
				if (machine[j] < machinetimes)
				{
					finish = j;
					machinetimes = machine[j];
				}
			}
			machine[finish] += works[i];
		}
	}
	//排序找哪台机器时间最长
	sort(machine, machine + m, myobject);
	return machine[m - 1];
}

//10 5 3 7 2 1
int main()
{
	vector<int> works = {10,5,3,7,2,1};
	int m = 0;
	cin >> m ;
	int times=besttimes(works,m);
	cout << times;
	return 0;
}

活动选择

有n个需要在同一天使用同一教师的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动a[i]就占据半开时间区域(s[i],f[i])。如果(s[i],f[i])和(s[j],f[j])互不重叠,a[i]和a[j]两个活动就可以被安排在一天。求使得尽量多的活动能不冲突的举行的最大数量。

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

//这里的思想不能由每个活动的开始时间进行比较
//也不能由每个活动的持续时间进行比较
//因为上面的题解是要求出一天当中最多可以进行多少活动
//由此上面的情况会出现时间冲突问题
//所以按结束的时间进行比较是最合理的

struct cmp
{
	bool operator()(vector<int>& a,vector<int>& b)
	{
		return a[1] < b[1];
	}
}cmp;

int most_activity(vector<vector<int>>& greed)
{
	sort(greed.begin(), greed.end(), cmp);
	int signtail = 0;
	int cnt = 0;
	for (auto& e : greed)
	{
		if (e[0] >= signtail)
		{
			signtail = e[1];
			cnt++;
		}
	}
	return cnt;
}

int main()
{
	vector<vector<int>> greed = { {2,5} ,{3,4},{1,6},{5,8},{5,7},{3,9},{7,10} };
	int size= most_activity(greed);
	cout << size << endl;
	return 0;
}

无重叠区间

给定一个区间的集合 intervals,其中 intervals[i] =[tarti,endi]。返回需要移除区间的最小数量
使剩余区间互不重叠。

在这里插入图片描述

方法一是和上面的题思路是一样的,就是在最后的结果改一下

class Solution {
public:
    struct cmp
    {
        bool operator()(vector<int>& a,vector<int>&b)
        {
            return a[1]<b[1];
        }
    }cmp;

    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        int num=1;
        int i=0;
        for(int j=1;j<intervals.size();j++)
        {
            if(intervals[j][0]>=intervals[i][1])
            {
                num++;
                i=j;
            }
            
        }
        return intervals.size()-num;
    }
};

第二种方法是考虑三种情况,删除一个就记录一下
上面的方法是将区间的尾进行排序,而下面的是将区间的头进行排序,分为下面的三种情况看图片

class Solution {
public:
    struct cmp
    {
        bool operator()(vector<int>& a,vector<int>&b)
        {
            return a[0]<b[0];
        }
    }cmp;

    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        int num=0;
        int i=0;
        for(int j=1;j<intervals.size();j++)
        {
            if(intervals[j][0]>=intervals[i][1])
            {
                i=j;
            }
            else
            {
                if(intervals[j][0]<intervals[i][1]&&intervals[j][1]<=intervals[i][1])
                {
                    i=j;
                    num++;
                }
                else
                {
                    num++;
                }
            }
        }
        return num;
    }
};

在这里插入图片描述

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

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

相关文章

LLM 04-大模型的数据

LLM 03-大模型的数据 到目前为止&#xff0c;我们已经讨论了大型语言模型的行为&#xff08;能力和损害&#xff09;。现在&#xff0c;我们要剥开洋葱的第一层&#xff0c;开始讨论这些模型是如何构建的。任何机器学习方法的起点都是训练数据&#xff0c;因此这就是我们开始的…

JDK10特性

文章目录 JAVA10概述语法层次的变化局部变量的类型推断不能使用类型推断的场景变量的声明初始值nulllambda表达式方法引用为数组静态初始化成员变量不能使用其他不可以的场景 API层次的变化集合的copyOf方法 总结 JAVA10概述 2018年3月21日&#xff0c;Oracle官方宣布JAVA10正…

sizeof和strlen求取数组指针之辨析

目录 一维数组中sizeof Vs strlen 整型数组sizeof 字符数组 sizeof strlen 字符串数组 sizeof strlen 字符串的指针char *p sizeof strlen 二维数组中sizeof 今天主要来讲题目主要是数组&指针辨析题和笔试题。&#x1f197;最近心情有点焦虑。大家一定专注…

进阶测试知识之风险基础测试

风险基础测试&#xff08;Risk-Based Testing&#xff09;是一种测试策略&#xff0c;其主要思想是根据产品或系统中各个部分的风险程度来优先进行测试。风险通常是由两个因素决定的&#xff1a;一是问题&#xff08;如缺陷或错误&#xff09;发生的可能性&#xff0c;二是如果…

嵌入式入门教学——模电基础概念

目录 1、模拟信号和模拟电路 2、研究领域 3、常用术语 3.1、共价键 3.2、电场 3.3、温度的电压当量 3.4、动态信号 3.5、直流电流和交流电流 3.6、内阻 3.7、信号频率 3.8、电容 3.9、电感 3.10、相位 3.11、信号失真 3.12、电导 3.13、跨导 3.14、电位 3.15…

【小沐学NLP】AI辅助编程工具汇总

文章目录 1、简介2、国内2.1 aiXcoder2.1.1 工具特点2.1.2 部署方式2.1.3 使用费用2.1.4 代码测试2.1.4.1 代码搜索引擎2.1.4.2 在线体验 2.2 CodeGeeX2.2.1 工具特点2.2.2 部署方式2.2.3 使用费用2.2.4 代码测试 2.3 Alibaba Cloud AI Coding Assistant&#xff08;cosy&#…

PCalc for Mac - 打开科学计算新世界的好用工具

无论您是学生、教师、科学家还是专业计算人员&#xff0c;一款强大而易于使用的科学计算器都是必不可少的工具。现在&#xff0c;我们向您介绍PCalc for Mac&#xff0c;这是一款功能齐全且界面精美的科学计算器&#xff0c;将为您带来卓越的计算体验。 PCalc for Mac是一款专…

第二章 进程与线程 五、线程(概念)

一、定义 &#xff08;1&#xff09;线程是一个基本的CPU执行单元&#xff0c;也是程序执行流的最小单位。 &#xff08;2&#xff09;引入线程后提升了系统的并发度。 &#xff08;3&#xff09;引入线程后&#xff0c;进程只作为除CPU之外的系统资源的分配单元。 二、引入…

POJ 3684 Physics Experiment 弹性碰撞

一、题目大意 我们有N个半径为R厘米的球&#xff0c;固定在距离地面高度为H的管道上&#xff0c;刚开始释放第一个&#xff0c;之后每过一秒释放一个&#xff0c;释放下面的球不会影响到上面的球的高度&#xff0c;忽略一切阻力&#xff0c;认为球之间的碰撞为弹性碰撞&#x…

传统生产者和消费者问题,Sychronized版和Lock版

1.生产者和消费者问题Synchronized版 面试&#xff1a;单例模式、排序算法、生产者消费者、死锁 package com.kuang.pc;/*** 线程之间的通信问题&#xff0c;生产者和消费者问题&#xff01; 等待唤醒 &#xff0c;通知唤醒* 线程交替执行 A B 操作同一个变量 num0* A num1;*…

无涯教程-JavaScript - ASINH函数

描述 ASINH函数返回数字的反双曲正弦值。反双曲正弦是其双曲正弦为number的值,即ASINH(SINH(number))等于number。 语法 ASINH (number)争论 Argument描述Required/OptionalNumberAny real number.Required Notes 如果指定的数字未被识别为数字值,则ASIN返回#VALUE!错误 …

想要精通算法和SQL的成长之路 - 填充书架

想要精通算法和SQL的成长之路 - 填充书架 前言一. 填充书架1.1 优化 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 填充书架 原题链接 题目中有一个值得注意的点就是&#xff1a; 需要按照书本顺序摆放。每一层当中&#xff0c;只要厚度不够了&#xff0c;当前层最高…

Chatbase:AI客服聊天机器人工具

【产品介绍】 名称 Chatbase.co 具体描述 Chatbase.co 是一个智能的聊天机器人平台&#xff0c;它可以帮助用户快速地构建、部署和分析用户的聊天机器人&#xff0c;无论 用户是一个初学者还是一个专家。用户可以使用 Chatbase.co …

什么是边缘计算网关?

边缘计算网关&#xff08;简称 边缘网关&#xff09;将云端功能扩展到本地的边缘设备&#xff0c;使边缘设备能够快速自主地响应本地事件&#xff0c;提供低延时、低成本、隐私安全、本地自治的本地计算服务。 同时所有服务都以 Docker 镜像方式安装&#xff0c;真正做到了跨平…

基础算法---离散化

概念 离散化&#xff0c;把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的时空效率。 通俗的说&#xff0c;离散化是在不改变数据相对大小的条件下&#xff0c;对数据进行相应的缩小。 也就是说当数据空间跨越太大,但是数据的个数却不多,我们可以使用…

Linux命令-文件展示

1、ls、ll命令——展示数据 ①ls命令——平铺展示数据 其中ls命令以平铺的方式展现数据 ②ll命令——列表展示数据 ll命令以列表的方式展现数据 -a选项&#xff0c;表示&#xff1a;all的意思&#xff0c;即列出全部文件&#xff08;包含隐藏的文件/文件夹&#xff09; -l选项…

Linux centos7 bash编程训练

训练编写一段代码&#xff0c;打印输出100之内的明7暗7&#xff0c;同时要求每5个数字打印在一行。 此项训练主要是考察for循环的使用&#xff0c;及条件判断表达式的设置和不同写法的应用。 常用的for循环有四种写法&#xff08;如打印1-100的整数&#xff09;&#xff1a; …

数据优化与可视化:3D开发工具HOOPS在BIM模型轻量化中的作用分析

在建筑和工程领域&#xff0c;BIM&#xff08;建筑信息建模&#xff09;是一种重要的数字化工具&#xff0c;但大型BIM模型往往需要大量的计算资源和存储空间。为了解决这一问题&#xff0c;HOOPS技术成为了一种关键工具&#xff0c;可以帮助实现BIM模型轻量化&#xff0c;提高…

docker 已经配置了国内镜像源,但是拉取镜像速度还是很慢(gcr.io、quay.io、ghcr.io)

前言 国内用户在使用 docker 时&#xff0c;想必都遇到过镜像拉取慢的问题&#xff0c;那是因为 docker 默认指向的镜像下载地址是 https://hub.docker.com&#xff0c;服务器在国外。 网上有关配置 docker 国内镜像源的教程很多&#xff0c;像 腾讯、阿里、网易 等等都会提供…

NVR添加rtsp流模拟GB28181视频通道

一、海康、大华监控摄像头和硬盘录像机接入GB28181平台配置 1、海康设备接入配置 通过web登录NVR管理系统&#xff0c;进入网络&#xff0c;高级配置界面&#xff0c;填入GB28181相关参数。 将对应项按刚才获取的配置信息填入即可&#xff0c;下面的视频通道的编码ID可以保持…