筆試演算法題分享

来源:https://www.cnblogs.com/swx123/archive/2023/10/16/17768294.html
-Advertisement-
Play Games

草船借箭 題目: 題目描述: 程式員小周同學這幾天在看《三國演義》。今天他看到了“草船借箭”這一回,在欽佩諸葛亮巧借東風向曹操“借"箭的同 時,小周想到這麼一個問題: 如果諸葛亮一共派出了N條放置草人的船來“借"箭。“悚慨”的曹操向第1條草船上射了A支 箭、第2條草船上射了B支箭,第3條草船上射的箭 ...


草船借箭

題目:

題目描述:
程式員小周同學這幾天在看《三國演義》。今天他看到了“草船借箭”這一回,在欽佩諸葛亮巧借東風向曹操“借"箭的同
時,小周想到這麼一個問題: 如果諸葛亮一共派出了N條放置草人的船來“借"箭。“悚慨”的曹操向第1條草船上射了A支
箭、第2條草船上射了B支箭,第3條草船上射的箭的數量等於前面兩條船上箭的數量之和多一支,第4條草船上射的箭的
數量等於前面三條船上的箭的數量之和多一支,...,以此類推,第N條草船上箭的數量等於前面N-1條船上箭的數量之和
多一支。 下麵問題來了,請問這一次諸葛亮一共從曹操那裡“借”了多少支箭呢?
輸入描述
輸入三個正整數N、A和B,三個正整數都不超過1000,並且保證N>1,且兩兩之間用空格隔開。
輸出描述
輸出諸葛亮“借”箭的總數量。結果對1e9+7取模。
樣例輸入
4 1 2
樣例輸出
15

思路:

  1. 求出每條船上的箭頭數量。由nums保存

​ a.當天箭頭的數量是前面箭頭數量和+1,由 preSum保存

  1. 求出所有總和,即nums數組求和即可

如果寫過斐波拉切數列那麼本題思路就會比較明確。


#include <cmath>
#include <vector>
#include <stdint.h>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <numeric>
#include <algorithm>
#include <iostream>
#include <climits>
#include <deque>
#include <bitset>
#include <functional>
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include <stack>
#include <queue>
using namespace std; 

int main() {
    long long mod = 1e9 + 7;
    int n = -1; cin >> n;
    vector<int> nums(n,0);
    cin >> nums[0] >> nums[1];
    long long preSum = nums[0] + nums[1];
    for (int i = 2; i < n; ++i) {
        nums[i] = (preSum + 1)%mod;
        preSum += nums[i];
        preSum %= mod;
    }
    long long res = 0;
    for (int i = 0; i < nums.size(); ++i) {
        res += nums[i];
        res %= mod;
    }
    cout << res << endl;
    return 0;
}

隨機數選最少數字求和

本題也可見https://blog.csdn.net/qq_43522889/article/details/132460220,但是個人覺得有些鏈接中寫的思路有問題。

題目:

小明用電腦隨機生成了N個正整數,他希望從這N個數中選取若幹個數,使得它們的和等於M。這些隨機生成的數字可能會相同,但是每個數字最多只允許使用一次。
當然這樣的選取方案可能不存在,也可能有多個。
現在希望編寫一個程式,能夠找出數字個數最少的選取方案,輸出對應的最少數字的個數,如果無解輸出“No solution”。
輸入描述:

單組輸入,每組入2行。
第1行包含兩個正整數N和M,分別表示初始輸入的正整數個數和目標數字和(N<=1e3,M<=1e5)。
第2行為N個正整數,兩兩之間用空格隔開(每一個正整數均小於等於1e5)。
輸出描述:

輸出數字個數最少的選取方案中所包含的最少數字個數,如果無解輸出“No solution”。
樣例:

輸入
5 5
1 3 2 1 1
輸出
2

思路:

只需要輸出最後的個數,因此大概率是dp。

dp三要素:

​ dp含義:dp[i][j]表示考慮前i個數字的情況下,組合成j的最少數字個數。

​ 屬性:最小值,最少數字個數。

​ 狀態轉移方程:

dp[i][j] = min({ dp[i][j], dp[i - 1][j] });
if (j >= thisNum) {
dp[i][j] = min({dp[i][j],dp[i - 1][j - thisNum] + 1 });
}

代碼:



#include <cmath>
#include <vector>
#include <stdint.h>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <numeric>
#include <algorithm>
#include <iostream>
#include <climits>
#include <deque>
#include <bitset>
#include <functional>
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include <stack>
#include <queue>
using namespace std; 

int main() {
    int n, m; cin >> n >> m;
    vector<vector<int>> dp(n + 1, vector<int>(m+10, INT_MAX/2));//dp[i][j]表示考慮前i個數字,組合為j的最小的數字個數
    for (int i = 0; i < n + 1; ++i) {
        dp[i][0] = 0;//任何組合組成0 需要的個數是0個
    }
    vector<int> numsVt;
    for (int i = 0; i < n; ++i) {
        int t = -1; cin >> t;
        numsVt.push_back(t);
    }
    for (int i = 1; i <= n; ++i) {
        int thisNum = numsVt[i - 1];
        if (thisNum > m) { continue; }
        dp[i][thisNum] = 1;  //特殊賦值
        
        for (int j = 0; j <= m; ++j) {
            dp[i][j] = min({ dp[i][j], dp[i - 1][j] });
            if (j >= thisNum) {
                dp[i][j] = min({dp[i][j],dp[i - 1][j - thisNum] + 1 });
            }

        }
    }
    if (dp[n][m] == INT_MAX / 2) {
        cout << "No solution" << endl;
    }
    else
    {
        cout << dp[n][m] << endl;
    }
    return 0;
}

我的博客園:https://www.cnblogs.com/swx123
我的github(代碼一般都放在這裡):https://github.com/578223592


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原子化CSS是一種CSS的架構方法,傾向於使用用途單一且簡單的CSS,通常是根據視覺效果進行類的命名,不同於BEM規則的CSS,原子的意思就是將CSS進行拆分,每個樣式都有一個唯一的CSS規則 ...
  • 一、使用透明度 語法:opacity:0 註意:元素消失,但是還會占據空間,只是視覺看不出來 <style> .box{ width: 100px; height: 100px; background-color: aquamarine; opacity: 0; }</style><div clas ...
  • 當談到架構的高可用時,無論是高可用計算架構,還是高可用存儲架構,其本質的設計目的都是為瞭解決部分伺服器故障的場景下,如何保證系統能夠繼續提供服務。但在一些極端場景下,有可能所有伺服器都出現故障。例如,典型的有機房斷電、機房火災、地震、水災……這些極端情況會導致某個系統所有伺服器都故障,或者業務整體癱 ...
  • 複製字典 您不能簡單地通過輸入 dict2 = dict1 來複制一個字典,因為 dict2 只會成為 dict1 的引用,對 dict1 的更改也會自動應用於 dict2。 有多種方法可以複製字典,一種方法是使用內置的 copy() 方法。 示例,使用 copy() 方法製作字典的副本: this ...
  • MySQL欄位的時間類型該如何選擇?千萬數據下性能提升10%~30%🚀 前言 在MySQL中時間類型的選擇有很多,比如:date、time、year、datetime、timestamp... 在某些情況下還會使用整形int、bigint來存儲時間戳 根據節省空間的原則,當只需要存儲年份、日期、時 ...
  • 本文介紹基於Python中matplotlib模塊與seaborn模塊,利用多個列表中的數據,繪製小提琴圖(Violin Plot)的方法~ ...
  • 正文 直接說答案,這個問題無法實現。原因是因為std::vector容器的插入一定會調用類對象的構造函數或者移動構造函數。 說一下為什麼會有這個問題,因為不想用指針,我想直接通過類對象本身的RAII機制來實現的資源的控制,智能指針是一個解決方案,不過智能指針是寫起來很繁瑣,終究比不上值類型方便。不過 ...
  • 修改字典項 您可以通過引用其鍵名來更改特定項的值: 示例,將 "year" 更改為 2018: thisdict = { "brand": "Ford", "model": "Mustang", "year": 1964 } thisdict["year"] = 2018 更新字典 update() ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...