算法分析與設計 專題三

目錄

一、實驗目的

二、實驗內容

三、問題分析與求解

四、AC源代碼、截圖

五、實驗小結


一、實驗目的

1、了解貪心算法的分析過程,學會用貪心算法解決一些具體的問題。

2、了解廣度優先算法和深度優先算法。

、實驗內容

  1. 1992

當然,我們的收藏中至少需要一個電腦游戲。典型的可以說是“鎮上追逐”。在我們的案例中,笑臉叫杰克,正在穿過分成小田野的小鎮。有些田地被墻覆蓋,無法穿過它們。杰克收集積分,并試圖避免與追逐他的怪物接觸。一旦杰克吃了特殊點(或星號),情況就會顛倒過來,杰克可以吃怪物。以此類推,一次又一次。我相信你們每個人都見過這樣的游戲。

在我們的例子中,城鎮是隨機生成的。杰克總是從左上角開始,“獎勵星號”在右下角。在最困難的關卡中,只要杰克只向左和向下走幾步,獎金就會消失,這些步數恰好足以從一個角落到另一個角落。如果他朝著錯誤的方向邁出一步,他永遠無法及時到達那里。但防止被怪物抓住仍然很重要。因此,玩家必須選擇最好的方式到達右下角。你要確定鎮上有多少種不同的方式。

  1. 1042

約翰要去釣魚。他有 h 小時可用 (1 <= h <= 16),該地區有 n 個湖泊 (2 <= n <= 25),都可以沿著一條單行道到達。約翰從1號湖開始,但他可以在任何他想要的湖結束。他只能從一個湖到下一個湖,但除非他愿意,否則他不必在任何湖停留。對于每個 i = 1,...,n - 1,從湖泊 i 到湖泊 i + 1 所需的 5 分鐘間隔數表示為 ti (0 < ti <=192)。例如,t3 = 4 表示從湖 3 到湖 4 需要 20 分鐘。為了幫助計劃他的釣魚之旅,約翰收集了一些關于湖泊的信息。對于每個湖泊i,預計在最初的5分鐘內捕獲的魚的數量,記作fi(fi >= 0),是已知的。

每釣魚 5 分鐘,預計在接下來的 5 分鐘間隔內捕獲的魚數量就會以恒定的 di (di >= 0) 速率減少。如果預計在一個區間內捕獲的魚的數量小于或等于di,則在下一個區間內湖中將不再有魚。為了簡化計劃,約翰假設沒有其他人會在湖邊釣魚,以影響他預計捕獲的魚的數量。

編寫一個程序來幫助約翰計劃他的釣魚之旅,以最大限度地增加預期捕獲的魚的數量。在每個湖泊花費的分鐘數必須是 5 的倍數。

問題分析與求解

1.1992分析與求解:

? ? ? ?這道題是問你有多少種能最快到達終點的方法。注意這里的最快不是相對是最快。而是路線只能向右或者向下 不允許向上或者向左走。

2.1042分析與求解:

? ? ? ?我們可以把總時間分為兩個部分:在路上的時間和在釣魚的時間。由于路是單行的,所以在路上的時間取決于走的最遠距離,即到達的池塘的最大編號。 剩余的時間用于釣魚。我們可以把移動+釣魚的混合過程拆分為移動的過程和釣魚的過程,即指定一個池塘為終點,移動過程即從起點到終點的過程,釣魚的過程就是從起點到終點的各個池塘中選擇池塘釣魚,因為移動過程所需的時間已經在前面考慮過了,這個時候我們就可以認為需要移動的時候可以直接瞬間到達。然后,選擇到哪些池塘釣魚的策略采用貪心的方法,每個釣魚的5分鐘都選擇期望最大的那一個池塘,每在選擇一個池塘釣魚5分鐘,減少相應池塘的期望,增加計劃中在該池塘釣魚的時間,然后繼續選擇期望最大的池塘,直到釣魚的時間不夠,或者池塘里沒有魚了。如果池塘沒有魚了,還有時間的話,把多余的時間分配給第一個池塘。

四、AC源代碼、截圖

#include<stdio.h>
#include<malloc.h>
#include<string.h>typedef struct{int x, y;
}Point;typedef struct{Point Q[1100];int top, tail;
}Que;
Que q;void ini() {q.top = 0, q.tail = 0;}
void push(int x, int y) {q.Q[q.tail].x = x, q.Q[q.tail].y = y;q.tail++; if(q.tail > 1099) q.tail = 0;}
Point pop() {Point tt; tt = q.Q[q.top++]; if(q.top > 1099) q.top = 0; return tt;}
bool empty() {if(q.tail == q.top) return 1; return 0;}int R, S;
bool map[1005][1005];
int f[1005][1005];int main()
{int Case;int i, j;char x;Point tt;while(scanf("%d", &Case) != EOF){while(Case--){scanf("%d%d", &R, &S);for(i = 0; i < R; ++i){getchar();for(j = 0; j < S; ++j){scanf("%c", &x);map[i][j] = (x == '.'? 1 : 0);f[i][j] = 0;}}push(0, 0);f[0][0] = 1;while(!empty()){tt = pop();if(map[tt.x + 1][tt.y]){if(!f[tt.x + 1][tt.y]) push(tt.x + 1, tt.y);f[tt.x + 1][tt.y] += f[tt.x][tt.y];}if(map[tt.x][tt.y + 1]){if(!f[tt.x][tt.y + 1]) push(tt.x, tt.y + 1);f[tt.x][tt.y + 1] += f[tt.x][tt.y];}}printf("Existuje %d ruznych cest.\n", f[R - 1][S - 1]);}}return 0;
}

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;const int N=25;
int n,h;
int f[N],d[N],t[N];//f第一個五分鐘釣的魚量,d為每個五分鐘減少的魚量,t為i到i+1五分鐘的個數 
int ans;
int each[N];//記錄最終每條湖用的時間
int tans,teach[N];//最優釣魚量和各湖釣魚時間 
int th,tf[N];//有效釣魚時間和每條湖前五分鐘的釣魚量 int main()
{int i,j;while(cin>>n&&n>0){//當湖的數量為0的時候結束 cin>>h;//輸入時間 for(i=0;i<n;i++){cin>>f[i];//第一次的魚量 } for(i=0;i<n;i++){cin>>d[i];//每五分鐘減少的魚量 }for(i=0;i<n-1;i++){cin>>t[i];//每個湖間距離需要的時間片 }h*=12;//一小時12個時間片ans=-1;for(i=0;i<n;i++){//表示再第i條湖停下來 //初始化每一次貪心th=h;//有效時間先初始化為總時間 for(j=0;j<n;j++){tf[j]=f[j];//每條湖初始的釣魚量初始為第一次五分鐘的釣魚量 teach[j]=0;//每個湖的釣魚時間初始化為0 } tans=0;//最大釣魚數初始化為0 //對每五分鐘貪心選擇釣魚量最大的湖釣魚 while(th>0){//當有效時間大于0 int ind=0,max=tf[0];//令第一條湖的魚量為最大值 ,ind標記湖是第幾條湖 for(j=0;j<=i;j++){if(tf[j]>max){//不考慮順序先找第一次魚量最大的湖 max=tf[j];ind=j;}}if(max==0){//最大釣魚量為0時,將剩余的釣魚時間加到第一個湖上的釣魚時間 teach[0]+=th*5;//例如樣例一 break;}else{teach[ind]+=5;//最大湖的釣魚時間,每釣一次加一次五 tans+=tf[ind];//加上最大魚量的湖的該次的魚數 if(tf[ind]>=d[ind])//如果魚量不少于減少的魚數 ,則減 {tf[ind]-=d[ind];}else{tf[ind]=0;//小于減少數則賦值為0 }} th--;//有效時間減少一個時間片(一個時間片五分鐘) }if(i!=n-1){//i的話是表示在第i條湖停下來 h-=t[i];//減去到下一條湖的時間片 }if(tans>ans){//如果值大于前面的值,就把值賦給ans ans=tans;for(j=0;j<n;j++){each[j]=teach[j];//記錄最終每條湖用的時間 }}} cout<<each[0]; for(i=1;i<n;i++){cout<<", "<<each[i];}cout<<endl;cout<<"Number of fish expected: "<<ans<<endl;cout<<endl;}return 0;
} 

五、實驗小結

1.迷宮問題最短路徑問題中,每次處理的位置所對應的距離是嚴格遞增的,因此,一旦找到終點,當前的距離就是最短距離,

搜索可移動到的位置中,判斷條件不僅僅是不碰壁不超邊界,還有一個條件就是沒有到達過。因為,如果已經到達了這個位置,這說明已經有更短的路徑到達了這個位置,這次到達這個位置的路徑是更遠的,不可能達到最優解;

2.貪心算法存在的問題:

(1)不能保證求得的最后解是最佳的;
2不能用來求最大值或最小值的問題
3只能求滿足某些約束條件的可行解的范圍

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73710.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1688商品詳情接口:深度解析與應用實踐

在電商領域&#xff0c;1688作為中國領先的B2B平臺&#xff0c;擁有海量的商品信息。對于開發者、商家和數據分析師來說&#xff0c;獲取1688商品的詳細信息是實現數據分析、競品研究、自動化管理和精準營銷的重要手段。本文將詳細介紹1688商品詳情接口的使用方法、技術細節以及…

每日算法-250328

記錄今天學習和解決的LeetCode算法題。 92. 反轉鏈表 II 題目 思路 本題要求反轉鏈表中從 left 到 right 位置的節點。我們可以采用 頭插法 的思路來反轉指定區間的鏈表。 具體來說&#xff0c;我們首先定位到 left 位置節點的前一個節點 prev。然后&#xff0c;從 left 位置…

C語言中的位域:節省內存的標志位管理技術

位域&#xff08;Bit-field&#xff09; 是 C 語言中的一種特性&#xff0c;允許在結構體&#xff08;struct&#xff09;中定義占用特定位數的成員變量。通過位域&#xff0c;可以更精細地控制內存的使用&#xff0c;尤其是在需要存儲多個布爾值或小范圍整數時&#xff0c;可以…

【AI編程學習之Python】第一天:Python的介紹

Python介紹 簡介 Python是一種解釋型、面向對象的語言。由吉多范羅蘇姆(Guido van Rossum)于1989年發明,1991年正式公布。官網:www.python.org Python單詞是"大蟒蛇”的意思。但是龜叔不是喜歡蟒蛇才起這個名字,而是正在追劇:英國電視喜劇片《蒙提派森的飛行馬戲團》(Mo…

【openstack系列】虛擬化技術

OpenStack 是一個開源的云計算管理平臺,它本身并不直接提供虛擬化技術,而是通過集成不同的虛擬化解決方案來管理和編排計算、存儲和網絡資源。OpenStack 的核心優勢在于其靈活性和可擴展性,支持多種虛擬化技術(Hypervisor),使企業可以根據需求選擇合適的底層虛擬化方案。…

保姆級教程:Vue3 + Django + MySQL 前后端聯調(PyCharm+VSCode版)

一、環境準備與驗證 這里為減少篇幅&#xff0c;默認大家都安裝好了這些軟件。不會下載安裝的&#xff0c;教程也很多&#xff0c;這里不再做贅述。話不多說&#xff0c;咱們開始&#xff1a; 1. 安裝驗證 確保已安裝以下軟件并驗證版本&#xff1a; # 驗證Node.js node -v…

Spring Data審計利器:@LastModifiedDate詳解!!!

&#x1f552; Spring Data審計利器&#xff1a;LastModifiedDate詳解&#x1f525; &#x1f31f; 簡介 在數據驅動的應用中&#xff0c;記錄數據的最后修改時間是常見需求。Spring Data的LastModifiedDate注解讓這一過程自動化成為可能&#xff01;本篇帶你掌握它的核心用法…

洛谷題單1-P1001 A+B Problem-python-流程圖重構

題目描述 輸入兩個整數 a,b&#xff0c;輸出它們的和&#xff08;∣a∣,∣b∣≤109&#xff09;。 輸入格式 兩個以空格分開的整數。 輸出格式 一個整數。 輸入輸出樣例 輸入 20 30輸出 50方式-print class Solution:staticmethoddef oi_input():"""從…

CCF CSP 第33次(2024.03)(2_相似度計算_C++)(字符串中字母大小寫轉換+哈希集合)

CCF CSP 第33次&#xff08;2024.03&#xff09;&#xff08;2_相似度計算_C&#xff09; 題目背景&#xff1a;題目描述&#xff1a;輸入格式&#xff1a;輸出格式&#xff1a;樣例1輸入&#xff1a;樣例1輸出&#xff1a;樣例1解釋&#xff1a;樣例2輸入&#xff1a;樣例2輸出…

Windows .gitignore文件不生效的情況排查

概述 今天下班在家里搗騰自己的代碼&#xff0c;在配置.gitignore文件忽略部分文件的時候&#xff0c;發現死活不生效 問題根源 經過一通分析和排查才發現&#xff0c;是.gitignore文件的編碼錯了&#xff0c;剛開始還沒注意到&#xff0c;因為是在Windows下開發&#xff0c…

Uniapp自定義TabBar組件全封裝實踐與疑難問題解決方案

前言 在當前公司小程序項目中&#xff0c;我們遇到了一個具有挑戰性的需求&#xff1a;根據不同用戶身份動態展示差異化的底部導航欄&#xff08;TabBar&#xff09; 。這種多角色場景下的UI適配需求&#xff0c;在提升用戶體驗和實現精細化運營方面具有重要意義。 在技術調研…

四川省汽車加氣站操作工備考題庫及答案分享

1.按壓力容器的設計壓力分為&#xff08; &#xff09;個壓力等級。 A. 三 B. 四 C. 五 D. 六 答案&#xff1a;B。解析&#xff1a;按壓力容器的設計壓力分為低壓、中壓、高壓、超高壓四個壓力等級。 2.緩沖罐的安裝位置在天然氣壓縮機&#xff08; &#xff09;。 A. 出口處 …

2025年- G27-Lc101-542. 01 矩陣--java版

1.題目描述 2.思路 總結&#xff1a;用廣度優先搜索&#xff0c;首先要確定0的位置&#xff0c;不為0的位置&#xff0c;我們要更新的它的值&#xff0c;只能往上下左右尋找跟它最近的0的位置。 解題思路 我們用 BFS&#xff08;廣度優先搜索&#xff09;求解&#xff0c;因為 …

CANopen基本理論

目錄 一、CANopen簡介 二、OD對象字典 2.1 OD對象字典簡介 2.2 CANopen預定義連接集 三、PDO過程數據對象 四、SDO過程數據對象 五、特殊協議 5.1 同步協議 5.2 時間戳協議 5.3 緊急報文協議 六、NMT網絡管理 6.1 NMT節點狀態 6.2 NMT節點上線報文 6.3 NMT心跳報…

【Zookeeper搭建】Zookeeper分布式集群搭建完整指南

Zookeeper分布式集群搭建 &#xff08;一&#xff09;克隆前準備工作 一、時鐘同步 步驟&#xff1a; 1、輸入date命令可以查看當前系統時間&#xff0c;可以看到此時系統時間為PDT&#xff08;部分機器或許為EST&#xff09;&#xff0c;并非中國標準時間。我們在中國地區…

MVC基礎概念及相應代碼示例

&#xff08;舊的&#xff09;代碼實現方法 一個功能模塊的代碼邏輯&#xff08;顯示處理&#xff0c;數據處理&#xff0c;邏輯判定&#xff09;都寫在一起(耦合) &#xff08;新的&#xff09;代碼MVC分層實現方法 顯示部分實現&#xff08;View視圖&#xff09; 數據處理實…

nginx優化(持續更新!!!)

1.調整文件描述符 # 查看當前系統文件描述符限制 ulimit -n# 永久修改文件描述符限制 # 編輯 /etc/security/limits.conf 文件&#xff0c;添加以下內容 * soft nofile 65535 * hard nofile 65535# 編輯 /etc/sysctl.conf 文件&#xff0c;添加以下內容 fs.file-max 655352.調…

apache連接池機制討論

apache連接池的連接有效性 server一般會配置keep-alive超時時間&#xff0c;過了這個時間還沒新請求到來&#xff0c;則關閉連接。客戶端從連接池里拿出連接時&#xff0c;會檢查一下連接是否已關閉&#xff0c;如已關閉&#xff0c;會丟棄掉該連接&#xff0c;并嘗試從連接池…

【QT5 多線程示例】條件變量

文章目錄 條件變量使用 wakeOne()使用 wakeAll() 條件變量 QT的條件變量類是QWaitCondition&#xff0c;有wakeOne() 和 wakeAll() 兩個方法 wakeOne()&#xff1a;僅喚醒一個等待的線程。wakeAll()&#xff1a;喚醒所有等待的線程。 使用 wakeOne() https://github.com/Bi…

備賽藍橋杯之第十六屆模擬賽第1期職業院校組第四題:世紀危機(人口增長推算)

提示&#xff1a;本篇文章僅僅是作者自己目前在備賽藍橋杯中&#xff0c;自己學習與刷題的學習筆記&#xff0c;寫的不好&#xff0c;歡迎大家批評與建議 由于個別題目代碼量與題目量偏大&#xff0c;請大家自己去藍橋杯官網【連接高校和企業 - 藍橋云課】去尋找原題&#xff0…