基础算法题——家庭作业(并查集的标记法、贪心)

2023-11-01

家庭作业

题目描述
题目
输入格式
第一行一个整数n ,表示作业的数量;
接下来 n行,每行包括两个整数,第一个整数表示作业的完成期限,第二个数表示该作业的学分。
输出格式
输出一个整数表示可以获得的最大学分。保证答案不超过 C/C++ 的 int 范围

输入输出样例
输入 #1
7
1 6
1 7
3 2
3 1
2 4
2 5
6 1
输出 #1
15
说明/提示
题目


思路一(有漏洞)

以第一关键字学分、第二关键字时间对 n 个作业进行排序。
从头开始遍历 n 个元素,用 now 记录当前时间,如果 now<hw[i].time 则 now++。
漏洞:可能学分 10、时间 9 的在前面,但学分 9、时间 1 的在后面,正解应该先拿学分 9,再拿学分 10。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

struct node{
	ll time, xf;
}hw[1000010];

bool cmp(node a, node b){
	if(a.xf==b.xf)
		return a.time<b.time;
	return a.xf>b.xf;
}

int main(){
	ll n;
//	freopen("1.in", "r", stdin);
	scanf("%lld", &n);
	for(ll i=0; i<n; i++)
		scanf("%lld%lld", &hw[i].time, &hw[i].xf);
	sort(hw, hw+n, cmp);
	
	ll now=0, sum=0;
	for(int i=0; i<n; i++)
	if(hw[i].time>now){
		sum += hw[i].xf;
		now++;
	}
	
	printf("%lld", sum);
	
	return 0;
}

思路二(有漏洞)

以第一关键字时间、第二关键字时间对 n 个作业进行排序。
从头开始遍历 n 个元素,用 now 记录当前时间,如果 now<hw[i].time 则 now++。
漏洞:如果时间长所的学分更高,那么时间短但学分低的会浪费时间。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

struct node{
	ll time, fx;
}hw[1000010];

bool cmp(node a, node b){
	if(a.time==b.time){
		return a.fx>b.fx;
	}
	return a.time<b.time;
}


int main(){
	ll n;
	scanf("%lld", &n);
	for(ll i=0; i<n; i++)
		scanf("%lld%lld", &hw[i].time, &hw[i].fx);
	sort(hw, hw+n, cmp);
	
	ll now=0, sum=0;
	//如果时间长所的学分更高,那么时间短但学分低的会浪费时间 
	for(int i=0; i<n; i++)
	if(hw[i].time>now){
		sum += hw[i].fx;
		now++;
	}
	
	printf("%lld", sum);
	
	return 0;
}

思路三(正解)

以第一关键字学分、第二关键字时间对 n 个作业进行排序。
并查集巧妙运用在时间轴上,将每个时间点都联系在一起,使每个时间点上得到的都是最优解。

#include<bits/stdc++.h>
using namespace std;
int bj[700010], flag;

struct node{
	int time, xf;
}hw[1000010];

bool cmp(node a, node b){
	if(a.xf==b.xf)
		a.time<b.time;
	return a.xf>b.xf;
}

int check(int x){
	if(x==0) 		//找不着 
		return 0;
	if(bj[x]==x){	//找着了 
		flag=1;
		bj[x] = x-1;
		return bj[x];
	}
	//没找着,但有找的空间 
	//寻找前面空闲时间并压缩路径 
	return bj[x] = check(bj[x]);	
}

int main(){
	int n;
	for(int i=0; i<700010; i++)
		bj[i]=i;
	scanf("%d", &n);
	for(int i=0; i<n; i++)
		scanf("%d%d", &hw[i].time, &hw[i].xf);
	sort(hw, hw+n, cmp);
	
	int ans=0;
	for(int i=0; i<n; i++){
		flag=0;
		bj[hw[i].time] = check(hw[i].time);
		if(flag)
			ans += hw[i].xf;
	}
	printf("%d", ans);
	
	return 0;
}

并查集学习过,但还是没能灵活运用,基础基础…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基础算法题——家庭作业(并查集的标记法、贪心) 的相关文章

随机推荐

  • RSA算法

    一 资料阅读 1 RSA算法 将两个大素数相乘十分容易 但那时想要对其乘积进行因式分解却极其困难 因此可以将乘积公开作为加密密钥 2 数字签名 又称公钥数字签名 电子签章 是一种类似写在纸上的普通的物理签名 但是使用了公钥加密领域的技术实现
  • 小程序登录及AppSecret(小程序密钥)

    在授权开发以后 需要提交小程序密钥 有小程序密钥第三方才有能力获取用户的一些信息 提供一些能力 平台分别提供多种方式实现微信登录 1 调用wx login接口 静默获取openid 适用场景 无需使用用户头像 昵称 Unionid信息 2
  • Echarts基本入门(一)

    一 关于Echarts图形的基本设置都是在 option中完成的 具体的配置可以参考官网链接 https www echartsjs com zh tutorial html ECharts 20 E4 B8 AD E7 9A 84 E6
  • 单片机实现 printf 打印输出,和电脑端一样用

    在学C语言时 printf 很好用 到了单片机 ARM时却不能用 那因为库中的 printf 是定向打印到显示屏的 所以我们把 printf 重新定向打印到串口就可以了 串口助手中就可以显示打印的内容 这样我们在单片机 ARM中就可以 像电
  • 1.性能测试项目实战

    怎么开展性能测试 什么时候开始性能测试 1 先确定需不需要做 客户有明确的性能需求 当没有明确需求时 如果市场用户访问量不大 时间允许就做一个基准测试 时间不允许就不做 市场用户量比较大 需要先跟产品 需求人员确定好性能需求 再去做对应的性
  • 申请带@msn.com后缀的邮箱

    很多朋友总是抱怨申请msn邮箱时总是申请到 hotmail com的 为什么申请不到 msn com的呢 我从网上Google了一下 这个地址是申请简体中文MSN邮箱的 https accountservices passport net
  • DC/AC:单相双极性SPWM逆变电路原理设计及MATLAB/Simulink实验仿真

    单相PWM逆变电路的主电路与单相方波逆变电路相同 如图所示 只是其驱动信号不再是占空比为50 的方波 而是采用PWM控制 将宽度变化的窄脉冲作为驱动信号 PWM技术的理论基础为面积等效原理 即形状不同但面积相等的窄脉冲加之于线性惯性环节时
  • html input设置非空,input非空检查解决方案

    当前位置 我的异常网 vbScript input非空检查解决方案 input非空检查解决方案 www myexceptions net 网友分享于 2013 03 10 浏览 62次 input非空检查 code VBScrip悬赏科技
  • 简述熔断、限流、降级

    高并发场景指的是在大量用户同时访问服务时 服务能够保持稳定和高效运行的能力 常用的解决高并发场景下服务不可用问题的技术手段包括熔断 限流和降级 熔断 当服务的错误率超过一定阈值时 熔断器会自动断开服务的调用 防止错误的服务继续对系统造成负载
  • 视频教程-Java从小白到大牛第3篇 【进阶篇】-Java

    Java从小白到大牛第3篇 进阶篇 一个在IT领域摸爬滚打20多年的老程序员 软件架构师 培训讲师 IT作家 熟悉Java Kotlin Python iOS Android 游戏开发 数据库开发与设计 软件架构设计等多种IT技术 参与设计
  • python中的特殊运算符

    运算符 描述 相当于python中的关键字 or 简述 usr bin env python coding UTF 8 Time 2019 9 16 15 10 Email spirit az foxmail com File tst py
  • Unity 回合制战斗系统(中级篇)

    项目文件找出来了 老版本的脚本有报错 我在新版2019 4 21f1c1下解决了报错 战斗场景可以正常跑的 需要的同学点下面地址下载 关注就行啦不用积分 祝大家都早日学成 项目包下载 上一篇文章里实现了较为初级的回合制战斗系统 仅限与1v1
  • LabVIEW开放神经网络交互工具包【ONNX】,大幅降低人工智能开发门槛,实现飞速推理

    文章目录 前言 一 工具包内容 二 工具包下载链接 三 工具包安装步骤 四 实现物体识别 五 实现图像分割 六 自然场景下的文字识别 七 人体关键点检测 总结 前言 前面给大家介绍了自己开发的LabVIEW ai视觉工具包 后来发现有一些o
  • SCI三区论文大修笔记(已录用)

    本人5月份往Journal of Process Control期刊投了一篇论文 是基于深度学习图像序列预测的 前几天收到一审结果 大修 两个审稿人给了几篇参考文献 此贴专门用来做笔记方便自己查阅 论文1 Video salient obj
  • Shell 输入输出重定向

    1 普通重定向 命令 说明 command gt file 将输出重定向到 file command lt file 将输入重定向到 file command gt gt file 将输出以追加的方式重定向到 file n gt file
  • 共享经济与颠覆,产生的反向是什么?理念与文化

    这几年共享经济 一个字 火 身边做这个的人也很多 火的原因是 给用户带来便捷 gt 投资者不需要较大资金就可以参与 gt 收益较稳定 众筹的理念从此剥离出 从以上 分析 产品的便捷性是启动共享经济最主要的起动机 然后更多带来管理上的难题 无
  • C++SVD分解求伪逆 (Eigen库)(附C++代码)

    SVD求解矩阵伪逆过程 首先对矩阵A进行SVD分解得到U D V三个矩阵 其中D为列矩阵 是从上到下 由大到小排列的A矩阵的奇异值 若D矩阵中元素个数为n则原矩阵有n个奇异值 构建大小为V cols U cols 的S矩阵 其中S矩阵的前n
  • 24 openEuler管理进程-调度启动进程

    文章目录 24 openEuler管理进程 调度启动进程 24 1 定时运行一批程序 at 24 1 1 at命令 24 1 2 设置时间 24 1 3 执行权限 24 2 周期性运行一批程序 cron 24 2 1 运行机制 24 2 2
  • 解决智慧树考试酷无法复制粘粘的问题

    相信用过智慧树和考试酷的大学生在做章节测试和考试等都会遇到无法复制粘粘的困惑 这篇博客总结了几个步骤 希望能帮助到大家 复制 首先在我们答题的页面 按住F12 有的电脑是Fn F12 点击下图圈出来的位置 选择我们要复制的地方 我们将鼠标移
  • 基础算法题——家庭作业(并查集的标记法、贪心)

    家庭作业 题目描述 输入格式 第一行一个整数n 表示作业的数量 接下来 n行 每行包括两个整数 第一个整数表示作业的完成期限 第二个数表示该作业的学分 输出格式 输出一个整数表示可以获得的最大学分 保证答案不超过 C C 的 int 范围