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

牛客刷题-Day15

牛客刷题-Day15

今日刷题:\(1011-1015\)

1011 小A与任务

题目描述

小A手头有 \(n\) 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务。
\(i\) 个任务需要花费 \(x_i\) 的时间,同时完成第 \(i\) 个任务的时间不能晚于 \(y_i\),时间掌控者向小A提出了一个条件:如果完成第 \(i\) 个任务的时间本应是 \(t\),但小A支付 \(m\) 个金币的话,他可以帮助小A在 \(t−m×z_i\) 时刻完成第 \(i\) 个任务,\(z_i\) 是时间参数,会在输入中给出。
小A想按时完成所有任务,请你帮他制定一个花费金币最少的方案。
注意:不能使得某个任务的花费时间小于 \(0\),花费的金币可以不是整数。

输入描述

第一行一个整数 \(n\) ,表示小A的任务数量。
接下来 \(n\) 行,每行三个整数,分别表示 \(z_i,x_i,y_i\)

输出描述

一行一个实数,表示小A最少需要花费的金币数,四舍五入保留一位小数。

示例

输入

5
1 1 2
1 1 3
1 2 4
1 1 4
1 2 5

输出

2.0

说明
\(1\) 时刻完成第一个任务,\(2\) 时刻完成第二个任务,\(4\) 时刻完成第三个任务,花费 \(1\) 金币在 \(4\) 时刻完成第四个任务,花费 \(1\) 金币在 \(5\) 时刻完成第五个任务。

备注

\(1≤n≤2×10^5\)
\(1≤x_i,z_i≤3×10^3\)
\(1≤y_i≤10^5\)

解题思路

按照要求结束时间从小到大排序。
首先考虑完成当前任务需要的结束时间 \(sum\),如果超时,则需要花费金币减少耗费的时间,减少相同的时间,时间参数越大花费的金币越少。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;int n;
struct Node {int x, y, z;
} a[N];
priority_queue<pair<int, int>> q;bool cmp(Node a, Node b) {return a.y < b.y;
}int main() {scanf("%d", &n);for (int i = 1; i <= n; i++)scanf("%d%d%d", &a[i].z, &a[i].x, &a[i].y);sort(a + 1, a + n + 1, cmp); // 按照结束时间排序int sum = 0;double ans = 0;for (int i = 1; i <= n; i++) {sum += a[i].x;q.push({a[i].z, a[i].x});while (sum > a[i].y) {auto task = q.top();q.pop();int delta = min(sum - a[i].y, task.second);ans += (double) delta / task.first;sum -= delta;task.second -= delta;if (task.second) q.push(task);}}printf("%.1lf", ans);return 0;
}

1014 指纹锁

题目描述

HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁。该指纹锁的加密算法会把一个指纹转化为一个不超过 \(1e^7\) 的数字,两个指纹数值之差越小,就说明两个指纹越相似,当两个指纹的数值差 \(≤k\) 时,这两个指纹的持有者会被系统判定为同一个人。
现在有 \(3\) 种操作,共 \(m\) 个,
操作 \(1\)add x,表示为指纹锁录入一个指纹,该指纹对应的数字为 \(x\),如果系统内有一个与 \(x\) 相差 \(≤k\) 的指纹,则系统会忽略这次添加操作;
操作 \(2\)del x,表示删除指纹锁中的指纹 \(x\),若指纹锁中多个与 \(x\) 相差 \(≤k\) 的指纹,则全部删除,若指纹锁中没有指纹 \(x\),则可以忽略该操作;
操作 \(3\)query x,表示有一个持有指纹 \(x\) 的人试图打开指纹锁,你需要设计一个判断程序,返回该人是否可以打开指纹锁(只要 \(x\) 与存入的任何一个指纹相差 \(≤k\) 即可打开锁)。
初始状态,指纹锁中没有任何指纹。

输入描述

第一行有 \(2\) 个正整数 \(m\)\(k\)
接下来 \(m\) 行,每行描述一种操作:add xdel xquery x

输出描述

对于每个 query 操作,输出一行,包含一个单词 YesNo,表示该人是否可以打开指纹锁。

示例1

输入

4 3
add 1
add 10
query 5
query 4

输出

No
Yes
示例2

输入

4 3
add 1
query 4
del 1
query 4

输出

Yes
No
示例3

输入

6 3
add 10
query 10
add 5 
query 5
del 7		//系统将指纹10和指纹5全部删除
query 8

输出

Yes
Yes
No

备注

对于 \(100\%\) 的测试数据:\(1 ≤ k,m ≤ 1000000\)
数据量较大,注意使用更快的输入输出方式。

解题思路

重写 \(Set\) 判重和排序。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;int m, k, x;
string op;struct cmp {bool operator()(int a, int b) const {if (abs(a - b) <= k)return false;elsereturn a < b;}
};set<int, cmp> s;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cin >> m >> k;while (m--) {cin >> op >> x;if (op == "add") {if (s.find(x) == s.end())s.insert(x);} else if (op == "del") {if (s.find(x) != s.end())s.erase(x);} else {if (s.find(x) != s.end())puts("Yes");elseputs("No");}}return 0;
}

1015 新建 Microsoft Office Word 文档

题目描述

\(CSL\) 正在学习《计算机办公自动化》文件的建立与删除。
\(CSL\) 发现,当他新建一个 \(word\) 文档时,会得到一个名为"新建 Microsoft Office Word 文档.doc"的文件,再新建一个,则名为"新建 Microsoft Office Word 文档(2).doc",再新建,便是"新建 Microsoft Office Word 文档(3).doc"。不断新建,编号不断递增。倘若他已经新建了三个文档,然后删除了"新建 Microsoft Office Word 文档(2).doc",再新建一个就又会得到一个"新建 Microsoft Office Word 文档(2).doc"。
严格来说,\(Windows\) 在每次新建文档时,都会选取一个与已有文件编号不重复的最小正整数作为新文档的编号。
现在,请你编程模拟以上过程,支持以下两种操作:
New:新建一个 \(word\) 文档,反馈新建的文档的编号;
Delete id:删除一个编号为 \(id\)\(word\) 文档,反馈删除是否成功。
初始时一个文件都没有,"新建 Microsoft Office Word 文档.doc"的编号算作 \(1\)

输入描述

第一行一个正整数n表示操作次数,接下来 \(n\) 行,每行表示一个操作。若该行为 New,则表示新建,为 Delete id 则表示要删除编号为 \(id\) 的文档,其中 \(id\) 为一个正整数。操作按输入顺序依次进行。操作次数不超过 \(100000\),删除编号的数值不超过 \(100000\)

输出描述

对于输入的每一个操作,输出其反馈结果。对于新建操作,输出新建的文档的编号;对于删除操作,反馈删除是否成功:如果删除的文件存在,则删除成功,输出 Successful,否则输出 Failed

示例

输入

12
New
New
New
Delete 2
New
Delete 4
Delete 3
Delete 1
New
New
New
Delete 4

输出

1
2
3
Successful
2
Failed
Successful
Successful
1
3
4
Successful

解题思路

模拟。用小根堆保存删除过的文档序号。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;int n, id, idx;
string op;
priority_queue<int, vector<int>, greater<int>> deleteIds;
map<int, int> files;int main() {cin >> n;for (int i = 1, pos = 0; i <= n; i++) {cin >> op;if (op == "New") {if (deleteIds.empty()) {files[++pos] = 1;printf("%d\n", pos);} else {id = deleteIds.top();files[id] = 1;deleteIds.pop();printf("%d\n", id);}} else {cin >> id;if (files[id]) {files[id] = 0;deleteIds.push(id);puts("Successful");} else {puts("Failed");}}}return 0;
}
http://www.zskr.cn/news/25350.html

相关文章:

  • 数据结构学习(1)——指针、结构体、链表(C语言) - 实践
  • rhel v7 v8 local repository setting
  • 【完整版】vcruntime140_1.dll缺失?3步快速修复教程(含官方修复工具+系统适配指南)
  • linux 学习平台 arm+x86 搭建 - 详解
  • 告别重复劳动,MonkeyCode 让你的开发团队拥有永动机
  • 自主进化的AI大模型架构设想(解决大模型时效性问题):知识网络的拓扑设计 - 详解
  • 2025 年大连 AI 品牌最新推荐排行榜:甄选懂商业重实效的实力服务商大连Ai培训/大连Ai开发/大连Ai推广公司推荐
  • 2025 年国内氧化锆陶瓷厂家最新推荐排行榜:含黑色 / 白色 / 电子陶瓷等品类公司精选
  • 2025 运动木地板厂家最新推荐榜:权威甄选行业前五优质品牌,附专业选择指南
  • 大端存储(Big-Endian)和小端存储(Little-Endian)的区别
  • Debian13.1.0最新镜像迅雷下载
  • 【数据结构】二叉树的高频热门面试题大全 - 指南
  • 2025年服装辅料厂家权威推荐榜:服饰辅料,全品类辅料,箱包辅料源头厂家精选,品质保障与创新设计深度解析
  • SpringBoot使用TraceId日志链路追踪
  • 马尔可夫决策过程的理解
  • Cypress 插件实战:让你的测试不再“偶尔掉链子”
  • 洛谷P2474 [SCOI2008] 天平 题解
  • 2025年实验室/手术室净化工程厂家推荐排行榜:涵盖无尘车间装修、洁净室建设、医院净化工程等全方位解决方案精选
  • 详细介绍:网络安全防御指南:全方位抵御暴力破解攻击
  • 2025年苹果仓厂家权威推荐榜单:苹果仓民宿,移动房苹果仓,出口苹果仓,外贸出口苹果仓,集装箱苹果仓,景区苹果仓,苹果仓房屋,网红苹果仓,可移动式苹果仓公司推荐
  • 多轮对话中,如何判断前后两次提问是否存在依赖关系
  • 基于SpringBoot的课程信息管理系统设计与实现 - 实践
  • 机器学习可扩展性:从1到百万用户的架构演进
  • 2025年保洁公司推荐排行榜,驻场保洁/钟点保洁/开荒保洁/外包保洁/商场保洁/办公楼保洁/工厂保洁/医院保洁/企业保洁服务优选指南
  • macOS 内核路由表执行:直接 API 编程指南
  • 2025年扑灭司林厂家推荐排行榜,高效环保杀虫剂,农业/卫生防疫专用扑灭司林原药及制剂公司推荐
  • 单细胞转录组:差异基因分析和富集分析 - 教程
  • DBA必备脚本:Oracle获取绑定变量的字面SQL文本版版本替代
  • 083_尚硅谷_多分支基本使用
  • 为什么制造业的仓库经验,放到电商就行不通?