信息奧林匹克競賽之貪心算法-課件_第1頁
信息奧林匹克競賽之貪心算法-課件_第2頁
信息奧林匹克競賽之貪心算法-課件_第3頁
信息奧林匹克競賽之貪心算法-課件_第4頁
信息奧林匹克競賽之貪心算法-課件_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

武松打老虎問題描述: 曾經(jīng)因打虎而文明的武松在x年后接到了景陽岡動物園的求助信,信上說:最近我們動物園逃跑了幾只老虎,請您把它們抓回來,thankyou!武松接到信后立刻上了山。正當他到半山腰是,suddenly!跳出n只猛虎來。每只老虎都有一塊虎牌,牌上寫著的是每一只虎最大擁有的體力,當武松與老虎PK時,若老虎的體力先用完,那么老虎over,否則武松over。求武松在over之前最多能干掉幾只老虎?(注:老虎是一只只上的)輸入文件: 第一行兩個數(shù)字n(n<50000),t0(武松的體力)。第二行n個數(shù)字,分別代表每只老虎的體力。所有變量都不超過longint范圍。輸出文件: 一行,最多能干掉的老虎數(shù)。樣例輸入:610153246樣例輸出: 4武松打老虎問題描述:分析題目所求:最多能干掉的老虎數(shù)目已知武松體力,每只老虎的體力,每干掉一只老虎,都會消耗相應體力。為了干掉更多的老虎每次干掉體力最少的老虎老虎體力:排序后體力:武松體力10第一輪PK:10-1=9第二輪PK:9-2=7第三輪PK:7-3=4第四輪PK:4-4=0分析題目所求:每次干掉體力最少的老虎老虎體力:排序后體力:武貪心算法潘玉斌

貪心算法潘玉斌貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:當前看來是最好的選擇:打死體力最少的老虎!貪心算法(貪心策略):老虎體力:當前看來是最好的選擇:打死體貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:10打死老虎數(shù)目:0貪心算法(貪心策略):老虎體力:武松體力:10打死老虎數(shù)目:貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:9打死老虎數(shù)目:1貪心算法(貪心策略):老虎體力:武松體力:9打死老虎數(shù)目:1貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:7打死老虎數(shù)目:2貪心算法(貪心策略):老虎體力:武松體力:7打死老虎數(shù)目:2貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:4打死老虎數(shù)目:3貪心算法(貪心策略):老虎體力:武松體力:4打死老虎數(shù)目:3貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:0打死老虎數(shù)目:4武松的體力已經(jīng)不能打死任何一頭老虎了,已得到問題的完整解。貪心算法(貪心策略):老虎體力:武松體力:0打死老虎數(shù)目:4貪心算法一定能得到最優(yōu)解嗎?要滿足以下條件:1、最優(yōu)子結(jié)構(gòu);2、貪心選擇性質(zhì);貪心算法一定能得到最優(yōu)解嗎?要滿足以下條件:1、最優(yōu)子結(jié)構(gòu);最優(yōu)子結(jié)構(gòu)定義:當問題的最優(yōu)解包括了其子問題的最優(yōu)解時,稱該問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。每打死一只老虎的體力值為ai,要使打死的老虎總數(shù)最多,就要使武松剩下的體力t0-ai能打死更多的老虎。即一個與武松體力t0相關的問題,可以轉(zhuǎn)換為t0-ai體力相關的問題。體力為t0-ai的是體力為t0的子問題。體力是t0時的最優(yōu)解,包括了體力為t0-ai的最優(yōu)解。該問題具備最優(yōu)子結(jié)構(gòu)。最優(yōu)子結(jié)構(gòu)定義:每打死一只老虎的體力值為ai,要使打死的老虎老虎體力:武松體力10最優(yōu)解為:打死體力為:1,2,3,4的老虎當打死一只體力為1的老虎后。老虎體力:武松體力9最優(yōu)解為:打死體力為:2,3,4的老虎子集老虎體力:武松體力10最優(yōu)解為:打死體力為:當打死一只體力為貪心選擇性質(zhì)定義:所求問題的整體最優(yōu)解可以通過一些列局部最優(yōu)的選擇,即貪心選擇來達到。貪心選擇:每次選擇剩下的老虎中體力最少的。武松剩下的體力值越大,能打死的老虎就越多。使用貪心選擇(每次選擇剩下的老虎中體力最少的),能使武松剩下的體力最大。這種貪心選擇,能保證全局最優(yōu),即能保證打死最多數(shù)量的老虎。因此具備貪心選擇性質(zhì)。貪心選擇性質(zhì)定義:貪心選擇:貪心選擇性質(zhì):所求問題的整體最優(yōu)解可以通過一些列局部最優(yōu)的選擇,即貪心選擇來達到。確定貪心選擇方法非常重要!!武松打老虎的貪心選擇為:每次選擇剩下的老虎中體力最少的。當前看來是最好的選擇貪心選擇性質(zhì):確定貪心選擇方法非常重要?。∥渌纱蚶匣⒌呢澬倪x最大數(shù)題目描述:設有n個正整數(shù)(n≤20),將它們聯(lián)接成一排,組成一個最大的多位整數(shù)。輸入描述:第一行一個正整數(shù)n。第二行n個正整數(shù),空格隔開。輸出描述:連接成的多位數(shù)樣例輸入:Sample1:313312343樣例輸出:Sample1:34331213最大數(shù)題目描述:分析貪心選擇方法方案一:把整數(shù)按從大到小的順序排列起/p>

312

13反例:7234246貪心選擇答案:2462374正確答案:7424623方案二:先按每個整數(shù)的第一位數(shù)字排序,大小相同的再按第二位數(shù)字排序,以此類推7234246

7424623反例:12121貪心選擇答案:12112正確答案:12121四個數(shù)字第一位分別是7、2、4、2;排列好2個數(shù)字(7和4)兩個2開頭的數(shù)比較下一位:3、4246在23之前分析貪心選擇方法方案一:把整數(shù)按從大到小的順序排列起來13分析完美方案:先把整數(shù)化成字符串,然后再比較a+b和b+a,如果a+b>b+a,就把a排在b的前面,反之則把a排在b的后面。如:12123因為:12123<12312所以:123在12之前如:12121因為:12112<12121所以:12在121之前分析完美方案:先把整數(shù)化成字符串,然后再比較a+b和b+a,代碼框架intcmp(char*s1,char*s2){比較函數(shù)}intmain(){

scanf("%d",&n);for(i=1;i<=n;i++){

讀取n個數(shù)

} {將n個數(shù)使用cmp()函數(shù)排序} {按排好的順序輸出(中間無空格)}}代碼框架intcmp(char*s1,char*s2)線段覆蓋題目描述:在一個數(shù)軸上有n條線段,現(xiàn)要選取其中k條線段使得這k條線段兩兩沒有重合部分(端點可以重合),問最大的k為多少輸入描述:輸入文件的第1行為一個正整數(shù)n,下面n行每行2個數(shù)字ai,bi,描述每條線段。輸出描述:輸出文件僅包括1個整數(shù),為k的最大值樣例輸入:3022413樣例輸出:2線段覆蓋題目描述:分析貪心選擇方案:每次選取線段右端點坐標最小的線段,保留這條線段,并把和這條線段有公共部分的所有線段刪除。重復這個過程,直到任兩條線段之間都沒有公共部分。

因為右端點坐標最小,可以保證所有與這條線段沒有公共部分的線段都在這條線段的右邊,且所有與這條線段有公共部分的線段兩兩之間都有公共部分。

又根據(jù)題意,在這些有公共部分的線段中,最后只能保留一條。顯然,右端點坐標最小,對后面線段的影響最小,所以,應保留這條線段。那么,如何證明以上貪心策略的正確性呢?每次取左端點坐標最小的行不行?每次取長度最短行不行?分析貪心選擇方案:每次選取線段右端點坐標最小的線段,保留這條均分紙牌題目描述

有N堆紙牌,編號分別為1,2,…,N。每堆上有若干張,但紙牌總數(shù)必為N的倍數(shù)??梢栽谌我欢焉先∪粲趶埣埮?,然后移動。移牌規(guī)則為:在編號為1堆上取的紙牌,只能移到編號為2的堆上;在編號為N的堆上取的紙牌,只能移到編號為N-1的堆上;其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上?,F(xiàn)在要求找出一種移動方法,用最少的移動次數(shù)使每堆上紙牌數(shù)都一樣多。例如N=4,4堆紙牌數(shù)分別為:①9②8③17④6移動3次可達到目的:從③取4張牌放到④(981310)->從③取3張牌放到②(9111010)->從②取1張牌放到①(10101010)。輸入描述:第一行N(N堆紙牌,1<=N<=100)第二行A1A2…An(N堆紙牌,每堆紙牌初始數(shù),l<=Ai<=10000)輸出描述:輸出至屏幕。格式為:所有堆均達到相等時的最少移動次數(shù)?!畼永斎?98176樣例輸出:3均分紙牌題目描述分析設a[i]為第i堆紙牌的張數(shù)(0<=i<=n),v為均分后每堆紙牌的張數(shù),s為最小移到次數(shù)。按照從左到右的順序移動紙牌。如第i堆(0<i<n)的紙牌數(shù)a[i]不等于平均值,則移動一次(即s加1),分兩種情況移動:(1)

若a[i]>v,則將a[i]-v張紙牌從第I堆移動到第I+1堆;(2)

若a[i]<v,則將v-a[i]張紙牌從第I+1堆移動到第I堆;為了設計的方便,我們把這兩種情況統(tǒng)一看作是將a[I]-v張牌從第I堆移動到第I+1堆;移動后有:a[I]:=v;a[I+1]:=a[I+1]+a[I]-v;貪心選擇:分析設a[i]為第i堆紙牌的張數(shù)(0<=i<=n),v為均分分析我們繼續(xù)按規(guī)則分析移牌過程,從第二堆移出9張到第一堆后,第一堆有10張紙牌,第二堆剩下-7張紙牌,再從第三堆移動17張到第二堆,剛好三堆紙牌數(shù)都是10,最后結(jié)果是對的,從第二堆移出的牌都可以從第三堆得到。我們在移動過程中,只是改變了移動的順序,而移動的次數(shù)不變,因此此題使用貪心法是可行的。在從第i+1堆中取出紙牌補充第i堆的過程中,可能會出現(xiàn)第i+1堆的紙牌數(shù)小于零(a[i+1]+a[i]-v<0)的情況。如n=3,三堆紙牌數(shù)為(1,2,27)這時v=10,為了使第一堆數(shù)為10,要從第二堆移9張紙牌到第一堆,而第二堆只有2張紙牌可移,這是不是意味著剛才使用的貪心法是錯誤的呢?分析我們繼續(xù)按規(guī)則分析移牌過程,從第二堆移出9張到第當不具備貪心選擇性質(zhì)時:得到較優(yōu)解。當不具備貪心選擇性質(zhì)時:得到較優(yōu)解。數(shù)字三角如圖所示的數(shù)字三角形,從頂部出發(fā),在每一結(jié)點可以選擇向左走或得向右走,一直走到底層,要求找出一條路徑,使路徑上的值最大。數(shù)字三角如圖所示的數(shù)字三角形,從頂部出發(fā),在每一結(jié)點可以選擇貪心法:7+8+1+7+5=28更優(yōu)方案:貪心法:更優(yōu)方案:7+3+8+7+5=30策略:從第一層開始選,每次選擇可選的數(shù)字中最大的數(shù)字第二層選擇小些的數(shù)目能達到更優(yōu)解不符合貪心選擇性質(zhì)貪心法:7+8+1+7+5=28更優(yōu)方案:貪心法:更優(yōu)方案:分析當不能100%確定一個貪心算法正確時,在使用之前,就應該嘗試證明它的不正確性。要證明其不正確,一種最簡單的方法就是舉一個反例。其實,要嚴格證明一個貪心算法的正確性是很困難的,目前最有效的一種方法叫“矩陣胚理論”,但是很復雜,中學生不可能理解。分析當不能100%確定一個貪心算法正確時,在使用之前,就應該謝謝謝謝信息奧林匹克競賽之貪心算法-課件29武松打老虎問題描述: 曾經(jīng)因打虎而文明的武松在x年后接到了景陽岡動物園的求助信,信上說:最近我們動物園逃跑了幾只老虎,請您把它們抓回來,thankyou!武松接到信后立刻上了山。正當他到半山腰是,suddenly!跳出n只猛虎來。每只老虎都有一塊虎牌,牌上寫著的是每一只虎最大擁有的體力,當武松與老虎PK時,若老虎的體力先用完,那么老虎over,否則武松over。求武松在over之前最多能干掉幾只老虎?(注:老虎是一只只上的)輸入文件: 第一行兩個數(shù)字n(n<50000),t0(武松的體力)。第二行n個數(shù)字,分別代表每只老虎的體力。所有變量都不超過longint范圍。輸出文件: 一行,最多能干掉的老虎數(shù)。樣例輸入:610153246樣例輸出: 4武松打老虎問題描述:分析題目所求:最多能干掉的老虎數(shù)目已知武松體力,每只老虎的體力,每干掉一只老虎,都會消耗相應體力。為了干掉更多的老虎每次干掉體力最少的老虎老虎體力:排序后體力:武松體力10第一輪PK:10-1=9第二輪PK:9-2=7第三輪PK:7-3=4第四輪PK:4-4=0分析題目所求:每次干掉體力最少的老虎老虎體力:排序后體力:武貪心算法潘玉斌

貪心算法潘玉斌貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:當前看來是最好的選擇:打死體力最少的老虎!貪心算法(貪心策略):老虎體力:當前看來是最好的選擇:打死體貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:10打死老虎數(shù)目:0貪心算法(貪心策略):老虎體力:武松體力:10打死老虎數(shù)目:貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:9打死老虎數(shù)目:1貪心算法(貪心策略):老虎體力:武松體力:9打死老虎數(shù)目:1貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:7打死老虎數(shù)目:2貪心算法(貪心策略):老虎體力:武松體力:7打死老虎數(shù)目:2貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:4打死老虎數(shù)目:3貪心算法(貪心策略):老虎體力:武松體力:4打死老虎數(shù)目:3貪心算法(貪心策略):每次都作出在當前看來是最好的選擇,不斷循環(huán),直到獲得問題的完整解。老虎體力:武松體力:0打死老虎數(shù)目:4武松的體力已經(jīng)不能打死任何一頭老虎了,已得到問題的完整解。貪心算法(貪心策略):老虎體力:武松體力:0打死老虎數(shù)目:4貪心算法一定能得到最優(yōu)解嗎?要滿足以下條件:1、最優(yōu)子結(jié)構(gòu);2、貪心選擇性質(zhì);貪心算法一定能得到最優(yōu)解嗎?要滿足以下條件:1、最優(yōu)子結(jié)構(gòu);最優(yōu)子結(jié)構(gòu)定義:當問題的最優(yōu)解包括了其子問題的最優(yōu)解時,稱該問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。每打死一只老虎的體力值為ai,要使打死的老虎總數(shù)最多,就要使武松剩下的體力t0-ai能打死更多的老虎。即一個與武松體力t0相關的問題,可以轉(zhuǎn)換為t0-ai體力相關的問題。體力為t0-ai的是體力為t0的子問題。體力是t0時的最優(yōu)解,包括了體力為t0-ai的最優(yōu)解。該問題具備最優(yōu)子結(jié)構(gòu)。最優(yōu)子結(jié)構(gòu)定義:每打死一只老虎的體力值為ai,要使打死的老虎老虎體力:武松體力10最優(yōu)解為:打死體力為:1,2,3,4的老虎當打死一只體力為1的老虎后。老虎體力:武松體力9最優(yōu)解為:打死體力為:2,3,4的老虎子集老虎體力:武松體力10最優(yōu)解為:打死體力為:當打死一只體力為貪心選擇性質(zhì)定義:所求問題的整體最優(yōu)解可以通過一些列局部最優(yōu)的選擇,即貪心選擇來達到。貪心選擇:每次選擇剩下的老虎中體力最少的。武松剩下的體力值越大,能打死的老虎就越多。使用貪心選擇(每次選擇剩下的老虎中體力最少的),能使武松剩下的體力最大。這種貪心選擇,能保證全局最優(yōu),即能保證打死最多數(shù)量的老虎。因此具備貪心選擇性質(zhì)。貪心選擇性質(zhì)定義:貪心選擇:貪心選擇性質(zhì):所求問題的整體最優(yōu)解可以通過一些列局部最優(yōu)的選擇,即貪心選擇來達到。確定貪心選擇方法非常重要??!武松打老虎的貪心選擇為:每次選擇剩下的老虎中體力最少的。當前看來是最好的選擇貪心選擇性質(zhì):確定貪心選擇方法非常重要??!武松打老虎的貪心選最大數(shù)題目描述:設有n個正整數(shù)(n≤20),將它們聯(lián)接成一排,組成一個最大的多位整數(shù)。輸入描述:第一行一個正整數(shù)n。第二行n個正整數(shù),空格隔開。輸出描述:連接成的多位數(shù)樣例輸入:Sample1:313312343樣例輸出:Sample1:34331213最大數(shù)題目描述:分析貪心選擇方法方案一:把整數(shù)按從大到小的順序排列起/p>

312

13反例:7234246貪心選擇答案:2462374正確答案:7424623方案二:先按每個整數(shù)的第一位數(shù)字排序,大小相同的再按第二位數(shù)字排序,以此類推7234246

7424623反例:12121貪心選擇答案:12112正確答案:12121四個數(shù)字第一位分別是7、2、4、2;排列好2個數(shù)字(7和4)兩個2開頭的數(shù)比較下一位:3、4246在23之前分析貪心選擇方法方案一:把整數(shù)按從大到小的順序排列起來13分析完美方案:先把整數(shù)化成字符串,然后再比較a+b和b+a,如果a+b>b+a,就把a排在b的前面,反之則把a排在b的后面。如:12123因為:12123<12312所以:123在12之前如:12121因為:12112<12121所以:12在121之前分析完美方案:先把整數(shù)化成字符串,然后再比較a+b和b+a,代碼框架intcmp(char*s1,char*s2){比較函數(shù)}intmain(){

scanf("%d",&n);for(i=1;i<=n;i++){

讀取n個數(shù)

} {將n個數(shù)使用cmp()函數(shù)排序} {按排好的順序輸出(中間無空格)}}代碼框架intcmp(char*s1,char*s2)線段覆蓋題目描述:在一個數(shù)軸上有n條線段,現(xiàn)要選取其中k條線段使得這k條線段兩兩沒有重合部分(端點可以重合),問最大的k為多少輸入描述:輸入文件的第1行為一個正整數(shù)n,下面n行每行2個數(shù)字ai,bi,描述每條線段。輸出描述:輸出文件僅包括1個整數(shù),為k的最大值樣例輸入:3022413樣例輸出:2線段覆蓋題目描述:分析貪心選擇方案:每次選取線段右端點坐標最小的線段,保留這條線段,并把和這條線段有公共部分的所有線段刪除。重復這個過程,直到任兩條線段之間都沒有公共部分。

因為右端點坐標最小,可以保證所有與這條線段沒有公共部分的線段都在這條線段的右邊,且所有與這條線段有公共部分的線段兩兩之間都有公共部分。

又根據(jù)題意,在這些有公共部分的線段中,最后只能保留一條。顯然,右端點坐標最小,對后面線段的影響最小,所以,應保留這條線段。那么,如何證明以上貪心策略的正確性呢?每次取左端點坐標最小的行不行?每次取長度最短行不行?分析貪心選擇方案:每次選取線段右端點坐標最小的線段,保留這條均分紙牌題目描述

有N堆紙牌,編號分別為1,2,…,N。每堆上有若干張,但紙牌總數(shù)必為N的倍數(shù)??梢栽谌我欢焉先∪粲趶埣埮?,然后移動。移牌規(guī)則為:在編號為1堆上取的紙牌,只能移到編號為2的堆上;在編號為N的堆上取的紙牌,只能移到編號為N-1的堆上;其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現(xiàn)在要求找出一種移動方法,用最少的移動次數(shù)使每堆上紙牌數(shù)都一樣多。例如N=4,4堆紙牌數(shù)分別為:①9②8③17④6移動3次可達到目的:從③取4張牌放到④(981310)->從③取3張牌放到②(9111010)->從②取1張牌放到①(10101010)。輸入描述:第一行N(N堆紙牌,1<=N<=100)第二行A1A2…An(N堆紙牌,每堆紙牌初始數(shù),l<=Ai<=10000)輸出描述:輸出至屏幕。格式為:所有堆均達到相等時的最少移動次數(shù)?!畼永斎?98176樣例輸出:3均分紙牌題目描述分析設a[i]為第i堆紙牌的張數(shù)(0<=i<=n),v為均分后每堆紙牌的張數(shù),s為最小移到次數(shù)。按照從左到右的順序移動紙牌。如第i堆(0<i<n)的紙牌數(shù)a[i]不等于平均值,則移動一次(即s加1),分兩種情況移動:(1)

若a[i]>v,則

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論