田忌賽馬貪心演算法 貪心演算法 田忌賽馬問題

2021-10-17 06:19:13 字數 2617 閱讀 9882

題目描述:

你一定聽過田忌賽馬的故事吧?

如果3匹馬變成1000匹,齊王仍然讓他的馬按從優到劣的順序出賽,田忌可以按任意順序選擇他的賽馬出賽。贏一局,田忌可以得到200兩銀子,輸一局,田忌就要輸掉200兩銀子,平局的話不輸不贏。

請問田忌最多能贏多少銀子?

關於輸入

輸入包含多組測試資料.

每組測試資料的第一行是乙個整數n(1<=n<=1000),表示田忌和齊王都擁有n匹馬。接下來一行是n個整數,表示田忌的馬的速度,下一行也是n個整數,表示齊王的馬的速度。

輸入的最後以乙個0表示結束。

關於輸出

對每組資料,輸出乙個整數,表示田忌至多可以贏多少銀子,如果田忌贏不了,就輸出乙個負數,表示田忌最少要輸多少銀子。

解題思路:

演算法可以用dp,或者給每匹馬連線賦權變為二分圖最佳匹配,還有就是貪心了。

1.當田忌最慢的馬比齊王最慢的馬快,贏一場先

2.當田忌最慢的馬比齊王最慢的馬慢,和齊王最快的馬比,輸一場

3.當田忌最快的馬比齊王最快的馬快時,贏一場先。

4.當田忌最快的馬比齊王最快的馬慢時,拿最慢的馬和齊王最快的馬比,輸一場。

5.當田忌最快的馬和齊王最快的馬相等時,拿最慢的馬來和齊王最快的馬比.

田忌賽馬貪心的正確性證明。

先說簡單狀況下的證明:

1.當田忌最慢的馬比齊王最慢的馬快,贏一場先。因為始終要贏齊王最慢的馬,不如用最沒用的馬來贏它。

2.當田忌最慢的馬比齊王最慢的馬慢,和齊王最快的馬比,輸一場。因為田忌最慢的馬始終要輸的,不如用它來消耗齊王最有用的馬。

3.當田忌最慢的和齊王最慢的馬慢相等時,分4和5討論。

4.當田忌最快的馬比齊王最快的馬快時,贏一場先。因為最快的馬的用途就是來贏別人快的馬,別人慢的馬什麼馬都能贏。

5.當田忌最快的馬比齊王最快的馬慢時,拿最慢的馬和齊王最快的馬比,輸一場,因為反正要輸一場,不如拿最沒用的馬輸。

6.當田忌最快的馬和齊王最快的馬相等時,這就要展開討論了,貪心方法是,拿最慢的馬來和齊王最快的馬比.

前面的證明像公理樣的,大家一看都能認同的,沒有異議的,就不細說了。

證明:田忌最快的馬和齊王最快的馬相等時拿最慢的馬來和齊王最快的馬比有最優解。

可以舉例來證明,比較容易理解。

c++程式**如下:

#include

#include

using namespace std;

void change(int &a, int &b)

int temp;

temp = a;

a = b;

b = temp;

void quicksort(int* a, int l, int u)

int i, m;

if (l >= u) return;

m = l;

for (i = l + 1; i <= u; i++)

if (a[i] >

a[l])

change(a[++m],

a[i]);

change(a[l], a[m]);

quicksort(a, l, m - 1);

quicksort(a, m + 1, u);

int main()

vector

result;

vector

ra;vector

rb;int num;

int* a;

int* b;

while

(cin>>num)

if (num == 0)

break;

a = new int[num];

b = new int[num];

for (int i = 0; i

< num; i++)

cin>>a[i];

for (int i = 0; i

< num; i++)

cin>>b[i];

quicksort(a, 0,

num-1);

quicksort(b, 0, num-1);

int win = 0;

int fail = 0;

int draw = 0;

int ib = 0, jb = 0;

int ie = num - 1, je = num -

1;while (ib <=

ie)if (a[ie]

> b[je])

win++;

ie--;

je--;

}else if

(a[ie] < b[je])

fail++;

ie--;

jb++;

}else

if(a[ib] > b[jb])

win++;

ib++;

jb++;

}else

if(a[ie] < b[jb])

fail++;

ie--;

jb++;

result.push_back(200*(win -

fail));

for (size_t i = 0; i != result.size(); i++)

cout<

return 0;

田忌賽馬貪心演算法 田忌賽馬問題 貪心演算法

關於輸入 輸入包含多組測試資料.每組測試資料的第一行是乙個整數n 1 n 1000 表示田忌和齊王都擁有n匹馬。接下來一行是n個整數,表示田忌的馬的速度,下一行也是n個整數,表示齊王的馬的速度。輸入的最後以乙個0表示結束。關於輸出 對每組資料,如果田忌能贏則輸出 win 如果田忌能輸則輸出 lose...

田忌賽馬貪心演算法 貪心演算法解決田忌賽馬

田忌賽馬 對策問題 教學目標 1 通過簡單的事例,使學生初步體會對策論在解決.梁錦美有無課件 上課時間 有 12 月 15 日 1 田忌賽馬中的數學問題 課時.同學們,你聽過 田忌賽馬 的故事嗎?第一次賽馬 上 上 中 中 下 田忌 下齊.上課周次 十六 有無課件 上課時間 有 12 月 15 日 ...

田忌賽馬 貪心演算法

演算法實驗課回顧 問題描述 你一定聽說過田忌賽馬的故事吧?如果3匹馬變成n匹 n 100 齊王仍然讓他的馬按照優到劣的順序初賽,田忌可以按任意順序選擇他的賽馬出賽。贏一局,田忌可以得到200兩銀子 輸一局,田忌就要輸掉200兩銀子。已知道國王和田忌的所有馬的奔跑速度,並且所有馬的奔跑速度均不相同,現...