演算法設計與分析 貪心演算法

2021-09-16 21:29:44 字數 4449 閱讀 7367

time limit: 1000 ms memory limit: 65536 kib

problem description

一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計乙個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。並證明演算法能產生乙個最優解。

對於給定的n和k個加油站位置,計算最少加油次數。

input

輸入資料的第一行有2 個正整數n和k(n≤5000,k≤1000),表示汽車加滿油後可行駛n公里,且旅途中有k個加油站。接下來的1 行中,有k+1 個整數,表示第k個加油站與第k-1 個加油站之間的距離。第0 個加油站表示出發地,汽車已加滿油。第k+1 個加油站表示目的地。

output

將計算出的最少加油次數輸出。如果無法到達目的地,則輸出「no solution!」。

sample input

7 7

1 2 3 4 5 1 6 6

sample output

4
不曉得一開始為啥不理解題意·····反正就是貪心,在最大行駛千公尺限制下走的越遠越好

#include using namespace std;

void jiayou(int n, int k, int a)

}int km = 0, cnt = 0;

for(int i = 0; i <= k; i++)

}printf("%d\n", cnt);

}int main()

jiayou(n, k, a);

return 0;

}

time limit: 1000 ms memory limit: 65536 kib

problem description

給定k 個排好序的序列s1 , s2,……, sk , 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合併2 個長度分別為m和n的序列需要m + n -1次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。

為了進行比較,還需要確定合併這個序列的最差合併順序,使所需的總比較次數最多。

對於給定的k個待合併序列,計算最多比較次數和最少比較次數合併方案。

input

輸入資料的第一行有1 個正整數k(k≤1000),表示有k個待合併序列。接下來的1 行中,有k個正整數,表示k個待合併序列的長度。

output

輸出兩個整數,中間用空格隔開,表示計算出的最多比較次數和最少比較次數。

sample input

4

5 12 11 2

sample output

78 52
hint

這個題的意思是給了四個序列進行合併,下邊給出的四個數分別是四個序列的長度

根據貪心演算法,最優時,應該先合併序列長度最小的, 最差時,就是應該先合併序列長度最大的

#include using namespace std;

int cmp(int a, int b) // 重寫sort函式,從大到小排序

int main()

int num1 = 0, num2 = 0;

sort(a, a + k); // 從小到大進行排序, 最優

sort(b, b + k, cmp); // 從大到小進行排序, 最差

for(int i = 0; i < k - 1; i++)

num1 -= (k - 1); // 因為最後要減去(n-1)個1

num2 -= (k - 1);

cout

王小二畢業後從事船運規劃工作,吉祥號貨輪的最大載重量為

m噸,有10種

貨物可以

裝船。第

i種貨物有wi噸,總價值是pi。

王小二的任務是從10種

貨物中挑選若干

噸上船,在滿足貨物總重量小於等於

m的前提下,運走的貨物的價重比最大。

input

輸入資料的第一行有乙個正整數

m(0

,表示所有貨物最大載重量。在接下來的

10行中,每行有若干個數(中間用空格分開),第

i行表示的是第

i種貨物的貨物

的總價值pi

,總重量w

i。(pi是wi的整數倍,0 

)output 輸出

乙個整數,表示可以得到的最大價值。

sample input

100

10 10

20 10

30 10

40 10

50 10

60 10

70 10

80 10

90 10

100 10

sample output

550
#include using namespace std;

// 不能拆分是動態規劃 可拆分的是貪心

int main()

for(int i = 0; i < 10; i++) // 選擇排序}}

int maxval = 0, h = 0;

while(m >= 0 && h < 10)

else

h++;

}printf("%d\n", maxval);

return 0;

}

time limit: 1000 ms memory limit: 65536 kib

submit

statistic

problem description

設x1 , x2 ,…… , xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?

對於給定的實直線上的n個點和閉區間的長度k,設計解此問題的有效演算法,計算覆蓋點集的最少區間數,並證明演算法的正確性。

input

輸入資料的第一行有2 個正整數n和k(n≤10000,k≤100),表示有n個點,且固定長度閉區間的長度為k。接下來的1 行中,有n個整數,表示n個點在實直線上的座標(可能相同)。

output

輸出乙個整數,表示計算出的最少區間數輸出。

sample input

7 3

1 2 3 4 5 -2 6

sample output

3
hint

#include using namespace std;

int main()

sort(a, a + n);

int temp = a[0], cnt = 1; // 初始cnt為1

for(int i = 0; i < n; i++)

}cout

submit

statistic

problem description

學校的大學生藝術中心週日將面向全校各個學院的學生社團開放,但活動中心同時只能供乙個社團活動使用,並且每乙個社團活動開始後都不能中斷。現在各個社團都提交了他們使用該中心的活動計畫(即活動的開始時刻和截止時刻)。請設計乙個演算法來找到乙個最佳的分配序列,以能夠在大學生藝術中心安排不衝突的盡可能多的社團活動。

比如有5個活動,開始與截止時刻分別為:

最佳安排序列為:1,4,5。

input

第一行輸入活動數目n(0

以後輸入n行,分別輸入序號為1到n的活動使用中心的開始時刻a與截止時刻b(a,b為整數且0<=a,b<24,a,b輸入以空格分隔)。

output

輸出最佳安排序列所包含的各個活動(按照活動被安排的次序,兩個活動之間用逗號分隔)。

sample input

6

8 10

9 16

11 16

14 15

10 14

7 11

sample output

1,5,4
#include using namespace std;

int main()

for(int i = 0; i < n; i++)}}

printf("%d", num[0]); // 該演算法是只考慮最早結束的時間, 那麼第乙個活動在排序後一定是最早結束的

int temp = e[0];

for(int j = 1; j < n; j++)

}cout<

return 0;

}

演算法設計與分析 貪心演算法

分解 將原問題求解過程劃分為連續的若干個決策階段 決策 在每乙個階段依據貪心策略進行貪心決策,得到區域性的最優解,並縮小待求解問題的規模 合併 將各個階段的區域性解合併為原問題的乙個全域性最優解 greedy c c是問題的輸入集合即候選集合 初始解集合為空集 while not solution ...

演算法設計與分析 貪心演算法

所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。貪心演算法的基本思路如下 1.建立數學模型...

演算法設計與分析9 貪心演算法

木棒加工問題 現有n根木棒,已知它們的長度和重量。要用一部木工機一根一根地加工這些木棒。該機器在加工過程中需要一定的準備時間,是用於清洗機器,調整工具和模版的。木工機需要的準備時間如下 1 第一根木棒需要1min的準備時間 2 在加工了一根長為l 重為w的木棒之後,接著加工一根長為l l l 重為 ...