CCF-CSP第41次认证第二题——机器人项目管理

题目描述

小 P 计划招募 n 个机器人完成一个项目:每个机器人负责其中的一项任务,编号从 1 到 n,任务之间互不干扰。如果完成任务 i 的耗时为 tit,则该项目总耗时为 t1+t2+⋯+tn。

作为项目管理者,小 P 可以用有限的预算为机器人们购买咖啡加油。其中负责任务 ii 的机器人,最多可以喝 ai​ 杯咖啡,从而将该任务耗时缩短 bibi​(最终耗时即为 ti−bi​)。

根据任务的特性和机器人的偏好,n 项任务可分为“灵活型”和“普通型”两类,详情参见附件资料(重要)。

已知小 P 可以为机器人们提供最多 mm 杯咖啡,试计算完成整个项目的最短时间。

输入格式

从标准输入读入数据。

输入的第一行包含空格分隔的两个正整数 n 和 m,分别表示任务数量和咖啡数量。

接下来 n 行,每行包含空格分隔的四个整数 oi、ti、ai 和 bi,表示一个任务。其中 oi∈{0,1} 表示任务类别,oi=0 表示灵活型、oi=1 表示普通型;其余变量含义如上所述,输入数据保证 ti>bi,即缩短后的耗时仍大于零。

输出格式

输出到标准输出。

输出一个实数,表示完成整个项目的最短时间。

样例1输入

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

样例1输出

6.6 

样例1解释

三个任务均为灵活型,初始总耗时为 2+3+4=9。最优方案为:给任务二分配 4 杯咖啡,耗时缩短 2;给任务三分配 11 杯咖啡,耗时相应缩短 25=0.4。综上,完成整个项目最短时间为 9−2−0.4=6.6。

样例2输入

5 62 0 10 2 1 0 10 1 1 1 500 40 360 1 600 50 500 1 400 20 150 

样例2输出

1008.5 

样例2解释

初始总耗时为 1520。最优方案为:给任务三分配 40 杯咖啡,耗时缩短 360;给任务五分配 20 杯咖啡,耗时缩短 150;给任务一和二各分配 1 杯咖啡,耗时分别缩短 0.5 和 1。综上,完成整个项目最短时间为 1520−360−150−0.5−1=1008.5。

子任务

80% 的测试点满足:所有任务均为灵活型任务,且对于每个任务 i 有 0<ai≤20;

全部的测试点满足:0<n≤200、0<m≤1000,且对于每个任务 ii 有 0<ai≤100、0<bi<ti≤104。

评分方式

输出结果与标准答案相比绝对误差小于 0.001 即可,推荐保留六位小数输出结果。

题解

基础的背包问题,单纯的01背包,需要把灵活型的咖啡拆成一杯一杯的再存入候选项中,最后用01背包做就行,这道题好像没有卡复杂度,直接拆就行,不用二进制优化。

0-1背包模版

int main() { cin>>n>>m; for(int i=1;i<=n;i++){ cin>>v[i]>>w[i]; } for(int i=1;i<=n;i++) for(int j=m;j>=v[i];j--) f[j]=max(f[j],f[j-v[i]]+w[i]); cout<<f[m]; return 0; }

代码如下

#include<bits/stdc++.h> using namespace std; const int N=210,M=1010; int n,m,o,t,a[N],sum,cnt; double b[N],dp[M]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>o>>t>>a[cnt]>>b[cnt]; sum+=t; if(o==0){ int temp=cnt; for(int j=1;j<a[temp];j++){ a[++cnt]=1; b[cnt]=b[temp]/(double)a[temp]; } b[temp]=b[temp]/(double)a[temp]; a[temp]=1; } cnt++; } for(int i=0;i<cnt;i++) for(int j=m;j>=a[i];j--) dp[j]=max(dp[j],dp[j-a[i]]+b[i]); cout<<sum-dp[m]<<endl; }

Read more

前端防范 XSS(跨站脚本攻击)

目录 一、防范措施 1.layui util  核心转义的特殊字符 示例 2.js-xss.js库 安装 1. Node.js 环境(npm/yarn) 2. 浏览器环境 核心 API 基础使用 1. 基础过滤(默认规则) 2. 自定义过滤规则 (1)允许特定标签 (2)允许特定属性 (3)自定义标签处理 (4)自定义属性处理 (5)转义特定字符 常见场景示例 1. 过滤用户输入的评论内容 2. 允许特定富文本标签(如富文本编辑器内容) 注意事项 更多配置 XSS(跨站脚本攻击)是一种常见的网络攻击手段,它允许攻击者将恶意脚本注入到其他用户的浏览器中。

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

目录 1. 打开浏览器开发者工具 2. 使用 Network 面板 3. 查看具体的API请求 a. Headers b. Payload c. Response d. Preview e. Timing 4. 实际操作步骤 5. 常见问题及解决方法 a. 无法看到API请求 b. 请求失败 c. 跨域问题(CORS) 作为一名后端工程师,理解前端如何调用接口、传递参数以及接收返回值是非常重要的。下面将详细介绍如何通过浏览器开发者工具(F12)查看和分析这些信息,并附带图片案例帮助你更好地理解。 1. 打开浏览器开发者工具 按下 F12 或右键点击页面选择“检查”可以打开浏览器的开发者工具。常用的浏览器如Chrome、Firefox等都内置了开发者工具。下面是我选择我的一篇文章,打开开发者工具进行演示。 2. 使用

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例)

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例) 前端开发中最令人头疼的莫过于那些难以定位的UI问题——元素错位、样式冲突、响应式失效...传统调试方式往往需要反复修改代码、刷新页面、检查元素。现在,通过Cursor编辑器集成的Codex功能,你可以直接用截图交互快速定位和修复这些问题。本文将带你从零开始,掌握这套革命性的调试工作流。 1. 环境准备与基础配置 在开始之前,确保你已经具备以下环境: * Cursor编辑器最新版(v2.5+) * Node.js 18.x及以上版本 * React 18项目(本文以Chakra UI 2.x为例) 首先在Cursor中安装Codex插件: 1. 点击左侧扩展图标 2. 搜索"Codex"并安装 3. 登录你的OpenAI账户(需要ChatGPT Plus订阅) 关键配置项: // 在项目根目录创建.