CSP202012-1期末预测之安全指数(C++100分)

CSP202012-1期末预测之安全指数(C++100分)

题目背景

期末要到了,小菜同学找到了自己的好朋友顿顿,希望可以预测一下自己这学期是否会挂科。

题目描述

首先,顿顿选取了如“课堂表现”、“自习时长”、“作业得分”、“社团活动参与度”等 n 项指标作为预测的依据。
然后,顿顿根据自己平日里对小菜的暗中观察,以百分制给每一项指标打分,即小菜同学第 i(1≤i≤n)项指标的得分 scorei 是一个 [0,100] 范围内的整数。
鉴于每一项指标的重要性不尽相同,顿顿用一个 [−10,10] 范围内的整数 wi 来表示第 i(1≤i≤n)项指标的重要程度。

最后,小菜同学期末的安全指数 y 定义如下:
y=ReLU(∑i=1nscorei⋅wi)

其中 ReLU(x)=max(0,x) 是一种常见的激活函数。
因为使用了 ReLU 函数,安全指数一定是个非负值。
如果安全指数过低(甚至为零),则说明小菜同学这学期很可能要挂科了……

已知每一项指标的重要程度 wi 和相应的得分 scorei,快来算算小菜同学期末的安全指数吧。

输入格式

从标准输入读入数据。

输入的第一行包含一个正整数 n,保证 2≤n≤105。

接下来输入 n 行,其中第 i(1≤i≤n)行包含用空格分隔的两个整数 wi 和 scorei,分别表示第 i 项指标的重要程度和小菜同学该项的得分。

输出格式

输出到标准输出。

输出一个非负整数 y,表示小菜同学期末的安全指数。

样例1输入

6
2 60
10 100
0 70
0 0
-10 50
10 60

Data

样例1输出

1220

Data

样例1解释

y=ReLU(1220)=1220

样例2输入

2
-10 100
-1 15

Data

样例2输出

0

思路

本题十分简单,累成之后加到sum中即可。


#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	int x, y, sum = 0;
	for (int i = 0; i < n; i++)
	{
		cin >> x >> y;
		sum += x * y;
	}
	cout << ((sum < 0 )? 0 : sum);
}
<think>好的,我现在需要解决用户关于CSP 202012-T3带配额的文件系统的C++实现和解题思路的问题。首先,我得回忆一下这个题目的具体要求。题目涉及到文件系统的配额管理,可能包括目录和文件的创建,以及配额的限制,比如子目录的数量、文件大小等。用户可能需要处理树形结构的数据,因此如何构建这个树结构是关键。 接下来,我得考虑如何表示文件系统的节点。每个节点可能是一个目录或文件,目录可以有子节点,并且需要记录配额信息,比如最大子目录数、最大文件大小等。这里可能需要一个结构体或类来表示节点,包含子节点的映射、当前的文件大小、配额限制等属性。 然后,处理用户的命令,比如创建文件或目录。创建时需要检查路径是否正确,是否已经存在同名节点,同时需要逐层检查父目录的配额是否允许新增。例如,创建文件时,要更新所有父目录的文件大小,并确保不超过各自的配额。这里需要注意路径解析,可能需要将路径割成各个组成部,逐层遍历树结构。 配额检查是关键部。每次添加文件或目录时,必须从当前目录向上遍历到根目录,检查每个层级的配额是否满足。比如,目录的子节点数量是否超过配额,或者文件总大小是否超出限制。如果任何一层配额不满足,整个操作应该失败。 还要考虑如何高效地处理这些检查。因为题目中的数据量可能较大,需要避免重复计算。例如,每个目录维护当前的文件大小和子目录数量,这样在检查时可以直接获取,而不需要每次遍历子树计算。 可能出现的问题包括路径解析错误,比如处理多个斜杠或者空路径部。此外,配额更新的同步问题,比如在创建文件时,需要先预检查配额是否足够,然后再实际创建,避免中间状态导致的不一致。 参考用户提供的引用[^2],用户提到学习建树思路的重要性,可能需要参考已有的树结构实现,比如使用哈希表来存储子节点,便于快速查找。同时,在处理配额时,每个节点需要记录自己的配额限制和当前使用情况。 现在,我需要将这些思路整理成步骤,并考虑如何用C++实现。例如,定义Node结构体,包含子节点映射、当前文件大小、配额等。然后处理每个命令,解析路径,逐层创建目录或文件,同时更新配额。最后,处理输出结果,成功或失败的原因。 可能还需要处理特殊情况,比如根目录的处理,路径以斜杠开头,或者路径中包含多个连续的斜杠。此外,配额的类型,比如目录配额和文件大小配额,需要别处理。 在测试时,需要注意大数据量的情况,确保时间效率。例如,使用哈希表(unordered_map)来存储子节点,以便快速查找和插入。同时,避免在每次操作时都遍历整个树,而是通过维护当前的使用情况来即时判断。 总结下来,解题步骤大致如下: 1. 定义树节点的结构,包括子节点、配额信息、当前使用情况。 2. 解析输入命令,离路径和参数(如文件大小)。 3. 处理路径,逐层遍历或创建目录节点。 4. 在创建文件或目录时,检查各级父目录的配额。 5. 根据检查结果决定操作是否成功,并输出相应信息。 在代码实现中,需要注意路径割、树结构的构建、配额的动态更新以及错误处理。同时,参考已有的AC代码可以帮助避免常见的错误,比如配额更新的顺序或者路径解析的细节问题。</think>针对CSP 202012-T3带配额的文件系统题目,以下是解题思路与C++实现的关键步骤: --- ### 一、问题析 题目要求模拟一个支持**目录配额**和**后代配额**的文件系统,需处理以下操作: 1. **创建文件**:检查路径合法性及各级目录的配额限制 2. **创建目录**:需处理目录已存在的情况 3. **配额限制**: - **目录配额**:限制直接子目录/文件数量 - **后代配额**:限制该目录下所有文件总大小 --- ### 二、数据结构设计 使用**树形结构**表示文件系统,每个节点包含: ```cpp struct Node { bool isDir; // 是否为目录 unordered_map<string, Node*> children; // 子节点 // 配额相关 int dirLimit = -1; // 目录配额(最大子节点数) int sizeLimit = -1; // 后代配额(最大总文件大小) int currentSize = 0; // 当前总文件大小 }; ``` --- ### 三、核心算法步骤 #### 1. 路径解析 将路径按`/`割为组件列表: ```cpp vector<string> parsePath(const string& path) { vector<string> res; stringstream ss(path.substr(1)); // 去掉开头的'/' string item; while (getline(ss, item, '/')) { if (!item.empty()) res.push_back(item); } return res; } ``` #### 2. 创建文件/目录 ```cpp bool createFile(const vector<string>& path, int fileSize) { Node* cur = root; // 遍历到倒数第二个节点(父目录) for (int i = 0; i < path.size()-1; ++i) { string& name = path[i]; if (!cur->children.count(name)) return false; // 路径不存在 cur = cur->children[name]; if (!cur->isDir) return false; // 非目录节点 } // 检查配额 if (!checkQuota(cur, path.back(), fileSize)) return false; // 创建文件并更新配额 cur->children[path.back()] = new Node{false}; updateSize(cur, fileSize); return true; } ``` #### 3. 配额检查 ```cpp bool checkQuota(Node* parent, const string& name, int fileSize) { // 检查目录配额 if (parent->dirLimit != -1 && parent->children.size() >= parent->dirLimit && !parent->children.count(name)) { return false; } // 检查后代配额 int total = parent->currentSize + fileSize; if (parent->sizeLimit != -1 && total > parent->sizeLimit) { return false; } // 回溯检查所有祖先 Node* cur = parent; while (cur) { if (cur->sizeLimit != -1 && (cur->currentSize + fileSize) > cur->sizeLimit) { return false; } cur = cur->parent; // 需要为节点添加parent指针 } return true; } ``` --- ### 四、实现要点 1. **树形遍历**:使用哈希表存储子节点,实现$O(1)$查找 2. **配额更新**:创建文件时,从当前目录向上回溯更新`currentSize` 3. **错误处理**: - 路径不存在时返回`"N"` - 配额超限时返回`"N"` - 成功时返回`"Y"` --- ### 五、性能优化 1. **预计算总大小**:每个节点维护`currentSize`,避免每次重新计算 2. **快速路径解析**:使用字符串流高效割路径 3. **哈希表选择**:使用`unordered_map`而非`map`,提升查找效率 --- ### 六、测试用例设计示例 ```text 输入: 10 C /A/B/file.txt 100 C /A/B # 创建目录 Q /A 2 150 # 设置配额(目录配额2,后代配额150) C /A/B/file2.txt 50 C /A/C/file3.txt 100 输出: Y # 创建文件成功 Y # 创建目录成功 Y # 设置配额成功 Y # 总大小100+50=150≤150 N # 超过后代配额(150+100=250>150) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值