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.pswp.cn/web/42276.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42276.shtml
英文地址,請注明出處:http://en.pswp.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;是華為和外企德科…