HJ41 称砝码下

接上文,HJ41 称砝码


更新acd代码,牛客代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int calculateWeight(int *weight, int weightLen, int *num, int numLen)
{int array[20001] = {0};int hash[300001] = {0};hash[0] = 1;int arrayIndex = 1;for(int i = 1; i <= num[0]; i++){int tempWeight = weight[0]  * i;if(hash[tempWeight] == 0){array[i] = tempWeight;arrayIndex++;}hash[array[i]]++;}for(int i = 1; i < numLen; i++){int tempArrayIndex = arrayIndex;for(int j = 1; j <= num[i]; j++){for(int k = 0; k < tempArrayIndex; k++){int tempWeight = j * weight[i] + array[k];if(tempWeight < 300000 && hash[tempWeight] == 0){hash[tempWeight]++;array[arrayIndex] = tempWeight;arrayIndex++;} }}}return arrayIndex;
}int main() {return 0;int count = 0;char countStr[4] = {'\0'};while (fgets(countStr, 4, stdin) != NULL) { // 注意 while 处理多个 case// 64 位输出请用 printf("%lld") to // countStr[1] = '\0';count = atoi(&countStr[0]);int weight[count];memset(weight, 0, sizeof(weight));int num[count];memset(num, 0, sizeof(num));char weightStr[200];char numStr[200];int weightIndex = 0;int numIndex = 0;fgets(weightStr, 200, stdin);fgets(numStr, 200, stdin);int len = strlen(weightStr);weightStr[strlen(weightStr) - 1] = '\0';numStr[strlen(numStr) - 1] = '\0';char* p = strtok(weightStr, " ");while(p){weight[weightIndex++] = atoi(p);p = strtok(NULL, " ");}p = strtok(numStr, " ");while(p){num[numIndex++] = atoi(p);p = strtok(NULL, " ");}int resultArrayIndex = calculateWeight(weight, count, num, count);printf("%d", resultArrayIndex);}return 0;
}

三、

3.1 最终aced了

//aced 通过全部用例
//运行时间
//2ms
//占用内存
//1708KB

这次的代码着实搞了很久,开始是因为不知道怎么样取端所有的砝码值,然后看了别人的代码,自己也尝试写出来了。

后面就是因为获取数据的时候出问题,包括获取数量值,获取重量值字符串数组的长度、以及获取个数值字符串数组的长度。

后面就是因为array数组的长度不够、以及hash数组长度不够导致程序一直会有问题。

这次的改进就是开始使用googleTest开始进行单元测试了。其实一开始c语言课程的时候就教过,但是当时没有意识到用处。后面写trafficLight测试用例的时候意识到了重要性。这次写牛客题用了感觉确实有用。

下面是对于空间复杂度的计算

显示计算了牛客编译器int型数组的字节数,printf(“%d”, sizeof(int));打印值是4。

// int array[20001] = {0};
// int hash[300001] = {0};total = 20000 * 4 + 300000 * 4 = 1,280,000Byte = 1280KB
// 和1708KB有区别,但是接近可参考

四、后续

还要看下别人是怎么实现的

这个算法是:后面每个重量都是weight[i] * num[i] + 前面已称出的砝码。所以保留第一种所有砝码的重量,然后将后面算出的砝码都和后面的相加。

看评论好像还有路径规划的算法。

另外就是比较和c++解题的差别。c++的会更好处理数组吗?不会出现数组长度分配不够大但是有担心过度分配的问题?

2024年7月8日19:33:48

今天看了下解题思路,然后其实一开始我还纠结于想看下官方解题的,觉得里面应该有关于路径规划的视频。搞了一段时间发现没有办法找到会员,除非淘宝买会员。最后只能硬看别人的代码,发现其实好像也不难。

下面先回答上面的几个问题。

首先就是如果使用c原因其实也不用那么麻烦。

第一个就是我用fgets获取每一行字符串然后再解析的,看别人的代码,使用scanf就可以了。

第二个就是我处理起来很棘手的问题,就是关于hash数组开辟多大的值。我从一开始的1000,最后到10万都不够,真尴尬,实际看别人的代码处理的方法就很简单。就是将所有砝码的值加起来得到一个最大值。用这个值作为数组的长度。另外就是关于存在唯一的砝码重量的array的长度,其实应该也是用砝码总重量来开辟。但是其实被人根本就没有处理,只是用了一个计数器来计数,是可以这样处理的,因为不需要记录这些唯一的砝码的重量。

需要用新的方法重新处理一下代码。

更新代码如下:

#define HJ41_20247820#ifdef HJ41_2024年7820
#include <string.h>int calculateWeight(int *weight, int weightLen, int *num, int numLen)
{int totalNum = 0;for(int i = 0; i < numLen; i++){for(int j = 1; j <= num[i]; j++){totalNum += j * weight[i];}}int array[totalNum];int hash[totalNum];memset(array, 0, sizeof(array));memset(hash, 0, sizeof(hash));hash[0] = 1;int arrayIndex = 1;for(int i = 1; i <= num[0]; i++){int tempWeight = weight[0]  * i;if(hash[tempWeight] == 0){array[i] = tempWeight;arrayIndex++;}hash[array[i]]++;}for(int i = 1; i < numLen; i++){int tempArrayIndex = arrayIndex;for(int j = 1; j <= num[i]; j++){for(int k = 0; k < tempArrayIndex; k++){int tempWeight = j * weight[i] + array[k];if(tempWeight < totalNum && hash[tempWeight] == 0){hash[tempWeight]++;array[arrayIndex] = tempWeight;arrayIndex++;}}}}return arrayIndex;
}#ifdef HJ41_2024年7220_WITH_MAIN
int main() {int count = 0;char countStr[4] = {'\0'};while (scanf("%d",&count) != EOF) { // 注意 while 处理多个 caseint weight[count];memset(weight, 0, sizeof(weight));for(int i = 0; i <count; i++){scanf("%d", &weight[i]);}int num[count];memset(num, 0, sizeof(num));for(int i = 0; i < count; i++){scanf("%d", &num[i]);}int resultArrayIndex = calculateWeight(weight, count, num, count);printf("%d", resultArrayIndex);}return 0;
}#endif#endif

上述代码很好的解决了输入数据获取的问题。同时也很简单的解决了hash数组和array数组的问题。下面是时间空间复杂度,怎么感觉比之前的还多呢,无语。先不管这个。

通过全部用例

运行时间9ms

占用内存8832KB

2024年7月8日20:45:40

增加对上述代码的修改

其实上述代码在Clion上运行的时候是有报错的,但是我没有看出来。

[ RUN      ] googleMyTest.HJ41_7
SetUp
TearDown
[       OK ] googleMyTest.HJ41_7 (1 ms)
[ RUN      ] googleMyTest.HJ41_8
SetUp进程已结束,退出代码为 -1073741571 (0xC00000FD)

其实HJ41_8示例没有跑完,调试代码发现在申请array[totalNum]的时候程序进入hardFault。感觉可能栈溢出了。然后使用堆内存申请资源。

改成

int* array = (int*)malloc(sizeof(int) * totalNum);
int* hash = (int*)malloc(sizeof(int) * totalNum);
memset(array, 0, sizeof(int) * totalNum);
memset(hash, 0, sizeof(int) * totalNum);

示例正常跑完。

现在我的疑虑是为什么直接写成int array[20001] = {0};不会报错呢?

然后我再看了下值,当第8个示例时,算出来的totalNum值为1097525,远大于之前写的2w,所以会溢出。使用堆内存申请避免溢出,这也解释了为什么第二版代码的占用内存为8832KB。因为确实占用的资源很多。

然后看了别人的代码,是这样得到重量最大值的。然后对于示例八,totalNum的值是199550。确实小了不少。

for(int i = 0; i < numLen; i++)
{totalNum += (weight[i] * num[i]);
}

哎,我觉得还是做的题目太少,才手忙脚乱没处理好。

五、总结

上述是集合处理方法,还有路径规范的没有实现。

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

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

相关文章

css 文件重复类样式删除

上传文件 进行无关 className 删除 <div style"display: flex;"><input type"file" change"handleFileUpload" /><el-button click"removeStyles" :disabled"!fileContent">Remove Styles and Download&…

navigation运动规划学习笔记

DWA 动态窗口算法(Dynamic Window Approaches, DWA) 是基于预测控制理论的一种次优方法,因其在未知环境下能够安全、有效的避开障碍物, 同时具有计算量小, 反应迅速、可操作性强等特点。 DWA算法属于局部路径规划算法。 DWA算法的核心思想是根据移动机器人当前的位置状态和速…

antd a-select下拉框样式修改 vue3 亲测有效

记录一下遇到的问题 1.遇到问题&#xff1a; 使用到Vue3 Ant Design of Vue 3.2.20&#xff0c;但因为项目需求样式&#xff0c;各种查找资料都未能解决; 2.解决问题&#xff1a; ①我们审查元素可以看到&#xff0c;下拉框是在body中的; ①在a-select 元素上添加dropdownCla…

运行时异常与一般异常的异同

运行时异常与一般异常的异同 1、运行时异常&#xff08;Runtime Exception&#xff09;1.1 特点 2、 一般异常&#xff08;Checked Exception&#xff09;2.1 特点 3、异同点总结3.1 相同点3.2 不同点 4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷…

【全网最全最详细】Tomcat 面试题大全

目录 一、说一说Tomcat的启动流程 二、Tomcat中有哪些类加载器? 三、为什么Tomcat可以把线程数设置为200,而不是N+1? 四、Tomcat处理请求的过程怎样的? 五、说一说Servlet的生命周期 六、过滤器和拦截器的区别? 七、介绍一下Tomcat的IO模型 八、说一说Tomcat的类加…

大语言模型系列-Transformer介绍

大语言模型系列&#xff1a;Transformer介绍 引言 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer模型已经成为了许多任务的标准方法。自从Vaswani等人在2017年提出Transformer以来&#xff0c;它已经彻底改变了NLP模型的设计。本文将介绍Transforme…

图形学各种二维基础变换,原来线性代数还能这么用,太牛了

缩放变换 均匀缩放 若想将一个图形缩小0.5倍 若x乘上缩放值s等于x撇&#xff0c;y同理&#xff0c;则 x ′ s x y ′ s y \begin{aligned} & x^{\prime}s x \\ & y^{\prime}s y \end{aligned} ​x′sxy′sy​&#xff0c;这样就表示了x缩小了s倍&#xff0c;y也是…

UML中用例之间的可视化表示

用例除了与参与者有关联关系外&#xff0c;用例之间也存在着一定的关系&#xff0c;如泛化关系、包含关系、扩展关系等。 4.2.1 包含关系 包含关系指的是两个用例之间的关系&#xff0c;其中一个用例&#xff08;称为基本用例&#xff0c;Base Use Case&#xff09;的行为包…

温度传感器的常见故障及处理方法

温度传感器作为现代工业、科研及日常生活中不可或缺的重要元件&#xff0c;其稳定性和准确性直接影响到设备的运行效率和安全。然而&#xff0c;由于各种因素的影响&#xff0c;温度传感器在使用过程中常会遇到一些故障。本文将针对这些常见故障进行分析&#xff0c;并提出相应…

如果你想手写Linux系统

哈喽&#xff0c;我是子牙老师。今天咱们聊聊这个话题吧&#xff0c;Linux作为当今科技世界的地基&#xff0c;我们越来越接近真理了&#xff0c;有木有&#xff1f; 这个文章的角度&#xff0c;你可能全网都很难找到第二篇如此系统讲透这个问题的文章 你可能想问&#xff1a…

LabVIEW电滞回线测试系统

铁电材料的性能评估依赖于电滞回线的测量&#xff0c;这直接关系到材料的应用效果和寿命。传统的电滞回线测量方法操作复杂且设备成本高。开发了一种基于LabVIEW的电滞回线测试系统&#xff0c;解决传统方法的不足&#xff0c;降低成本&#xff0c;提高操作便捷性和数据分析的自…

spring boot 3.x版本中集成spring security 6.x版本进行实现动态权限控制解决方案

一、背景 最近在进行项目从jdk8和spring boot 2.7.x版本技术架构向jdk17和spring boot 3.3.x版本的代码迁移&#xff0c;在迁移过程中&#xff0c;发现spring boot 3.3.x版本依赖的spring security版本已经升级6.x版本了&#xff0c;语法上和spring security 5.x版本有很多地方…

Mysql中存储引擎简介、修改、查询、选择

场景 数据库存储引擎 数据库存储引擎是数据库底层软件组件&#xff0c;数据库管理系统&#xff08;DBMS &#xff09;使用数据引擎进行创建、查询、更新和删除数据的操作。 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能&#xff0c;使用不同的存储引擎还可以…

【C++报错已解决】Invalid Use of ‘this’ Pointer

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言 一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;修正‘this’指针使用2…

React+TS前台项目实战(二十六)-- 高性能可配置Echarts图表组件封装

文章目录 前言CommonChart组件1. 功能分析2. 代码详细注释3. 使用到的全局hook代码4. 使用方式5. 效果展示 总结 前言 Echarts图表在项目中经常用到&#xff0c;然而&#xff0c;重复编写初始化&#xff0c;更新&#xff0c;以及清除实例等动作对于开发人员来说是一种浪费时间…

LVS-DR负载均衡

LVS-DR负载均衡 LVS—DR工作模式 原理 客户端访问调度器的VIP地址&#xff0c;在路由器上应该设置VIP跟调度器的一对一的映射关系&#xff0c;调度器根据调度算法将该请求“调度“到后端真实服务器&#xff0c;真实服务器处理完毕后直接将处理后的应答报文发送给路由器&#xf…

EDI安全:如何在2024年保护您的数据免受安全和隐私威胁

电子数据交换&#xff08;EDI&#xff09;支持使用标准化格式在组织之间自动交换业务文档。这种数字化转型彻底改变了业务通信&#xff0c;消除了对纸质交易的需求并加速了交易。然而&#xff0c;随着越来越依赖 EDI 来传输发票、采购订单和发货通知等敏感数据&#xff0c;EDI …

【跨境分享】中国商家如何卷到国外?电商独立站和电商平台的优势对比

为什么要选择独立站而不是电商平台 对于跨境电商经营者而言&#xff0c;采取多平台、多站点的运营策略是至关重要的战略布局。这一做法不仅有助于分散风险&#xff0c;避免将所有投资集中于单一市场&#xff0c;从而降低“所有鸡蛋置于同一篮子”的隐患&#xff0c;而且有利于拓…

【友邦保险-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

华为od相关信息分享

2024年OD统一考试&#xff08;D卷&#xff09;完整题库&#xff1a;华为OD机试2024年最新题库&#xff08;Python、JAVA、C合集&#xff09; 问 1.什么是华为od&#xff1f; 答&#xff1a;OD全称是Outsourcing Dispacth&#xff0c;即外包派遣&#xff0c;是华为和外企德科…