基礎演算法2 1 列舉法

2022-09-15 00:15:35 字數 2655 閱讀 6074

題目上新增了超連結,大家點一下題目就會自動跳轉到poj原題介面~~              

冲鸭衝鴨ヾ(◍°∇°◍)ノ゙。

列舉法由於建模簡單,所以用來提高

**實現能力十分合適,暴力搜尋ac題時成就感也是滿滿,而且列舉法應該是之後所有演算法的基礎。我覺得部分演算法的本質只是解決了如何列舉以及對列舉的優化。大家放心起航吧!

本章節弄懂題意就可以做,所以就不新增筆記啦

題意:已知乙個人的體力、情感和智力高峰出現的時間分別是 p、e、i, 它們的週期長度分別為 23 天、28 天和 33 天,求從給定時間 d 起,下一次三個 高峰同天的時間(距離給定時間的天數),所有給定時間是非負的並且小於 365, 所求的時間小於 21252。

#includeusing namespace std;

int main()

if (ans > start)

ans -= start;

else

ans = ans + 21252 - start;

cout << "case " << i++ << ": the next triple peak occurs in " << ans << " days." << endl;

cin >> a >> b >> c >> start;

}return 0;

}

題意:n 個邊長為 1 的立方體,把它們組合成乙個長方體,找出組成 最小表面積的長方體,輸出它的表面積。

#includeusing namespace std;

int main()}}

cout << s << endl;

}return 0;

}

題意:求所有小於等於 n 的,完美立方數 a,使得 a^3=b^3+c^3+d^3, a、b、c、d 均為整數,n 不超過 100。

小筆記:注意遍歷順序,不要因為小問題被罰時。

#include#includeusing namespace std;

int main()}}

}return 0;

}

題意: 有乙個公司由於某個病毒使公司贏虧資料丟失,但該公司每月的 贏虧是乙個定數,要麼乙個月贏利s,要麼一月虧d。現在acm只知道該公司每五個月有乙個贏虧報表,而且每次報表贏利情況都為虧。在一年中這樣的報表總共有8次(1到5,2到6,…,8到12),現在要編乙個程式確定當贏s和虧d給出,並滿足每張報表為虧的情況下,全年公司最高可贏利多少,若存在,則輸出多多額,若不存在,輸出"deficit"。

小筆記:這題感覺還是挺不好理解的,再加上原題是英語的話...這才是常態

#includeusing namespace std;

int main()

return 0;

}

題意:26 個大寫字母分別用對應位置的數字來替換(a=1,b=2,…,z=26), 給出 5~12 個不同的字母,從裡面取 5 個,用其替換值計算,使其滿足 v-w2+x3- y4+z5等於給定目標值。輸出滿足條件的且字典序 2最大的 5 個字母。

#include#include#include#includeusing namespace std;

bool cmp (char a, char b)

int main()

}if (flag)

break;

}if (flag)

break;

}if (flag)

break;

}if (flag)

break;

}if (flag == 0)

printf ("no solution\n");

}return 0;

}

題意:工廠**邊長分別為1,2,3,4,5,6的正方形板子,但工廠只有6*6的板子,其他的板子都是從這種板子上裁剪而來的。現在給出分別這些板子的需求量,問最少需要多少塊6*6的板子。

小筆記:列舉著、列舉著、就不像列舉了......這題出現策略了...

#include#includeusing namespace std;

int dir[4] = ;//使用下標塊邊長3後餘下的邊長2

int a[10];

int main()

if (!sum)//全為0

break;

ans = a[6] + a[5] + a[4] + (a[3] + 3) / 4; //計算邊長為3 4 5 6的大板子消耗量

//結餘的2*2板子數

int cnt_2 = a[4] * 5 + dir[a[3] % 4];

if (a[2] > cnt_2) //當上面剩餘的2*2板子量不足時,需要消耗新的板子

ans += (a[2] - cnt_2 + 8) / 9;

//上面造出的1*1板子數

int cnt_1 = ans * 36 - a[6] * 36 - a[5] * 25 - a[4] * 16 - a[3] * 9 - a[2] * 4;

if (a[1] > cnt_1) //當上面剩餘的1*1板子量不足時,需要消耗新的板子

ans += (a[1] - cnt_1 + 35) / 36;

printf ("%d\n", ans);

}return 0;

}

演算法基礎(1) 列舉

列舉在大家看來可能是乙個非常簡單的問題,不就是乙個遍歷演算法嘛,有什麼好說的,然而,在參加了北京大學mooc的演算法基礎後,我直接被震驚了。原來列舉演算法還能這麼玩!好吧,不說有的沒得沒得了,先來看第乙個例子 熄燈問題 這個問題的描述如下 乙個由按鈕組成的矩陣,其中每行有6個按鈕,共5行。每個按鈕的...

演算法入門 1 列舉法。

以下都是通過列舉法解決問題的。其實列舉法的本質就是把所有問題可能的結果都嘗試一邊,再通過某種條件將錯誤的結果篩選出去,留下的便是正確的結果。輸出乙個直角三角形,符合 注釋中的那個三角形格式。輸出乙個個三角形 輸入 5 輸出的是乙個五行的三角形 第一行 1個 第二行 2個 第五行五個 第一步 我們需要...

演算法基礎(一) 列舉

慕課 程式設計與演算法 二 演算法基礎 郭瑋老師課程的學習筆記 列舉,基於逐個嘗試答案的一種文體求解策略,根據所有可能的情況,並且一一判斷。大家可能會說列舉不就是一種簡單的將資料全都遍歷一遍嗎,但是在這裡我們將列舉進行優化,讓列舉更加聰明,從而達到演算法的目的,即提供更快更好的解題的方法,這樣列舉就...