列舉例題練習

2022-09-19 15:45:11 字數 2052 閱讀 8529

注意怎麼盡可能減少列舉的個數和範圍

例題一:生理週期

解題思路:這題還是比較簡單的,很容易就可以想到用列舉的方式解題,條件其實就是列舉每一天,看看距離所給高峰的距離能不能同時%23 28 33 ==0就好了。但是如果這樣設計的話很明顯就要用3重迴圈時間複雜度很高,如果給的資料很大的話很有可能會溢位,所以選擇要想乙個辦法把列舉的個數或者是範圍降低。那怎麼辦呢?

答案是:跳著找。因為每兩個週期之間還要列舉相應的間隔,這個間隔是完全沒必要列舉的,所以優化的思路就是先找到比如說第乙個體力巔峰的位置,然後跳著週期找,因為要同時滿足情商週期的同時也是體力週期,直到找到了乙個兩個週期重疊的位置,後面嘗試的時候只要嘗試既是體力高峰又是情商高峰的日子就好了。雙高峰的日子出現的間隔很明顯就是兩者的最小公倍數。所以現在跳著他倆的最小公倍數去找與第三個高峰重疊的日子。

**:

1

#include 2#

include

3using namespace std;

4int main()

15return

0;16 }

總結:這題就是告訴我們可以通過迴圈的設計減少列舉的次數。還有一些寫**怎麼寫的技巧。

例題2:稱硬幣(poj 1013):

題目大意:

解題思路:肯定是列舉咯!那要怎麼列舉呢?就是列舉天平兩邊每一枚硬幣分別是重和輕的情況。沒每一枚硬幣假設是輕的看看假設天平情況與題目中是否符合,若不符合再假設天平為重是否符合條件。其實我覺得這個列舉是相對不明顯,不容易想到的。

**:

1 #include 2 #include 3

using

namespace

std;

4char left[3][7];5

char right[3][7];6

char result[3][7];7

bool isfake(char c, bool

light) else

17switch(result[i][0

])31

return

true;32

}3334}

35int

main()

46if(isfake(c,false

))50

} 51}52

return0;

53 }

**的解釋與總結: 首先就是資料的儲存,總共就三種的資料,所以這個地方用了二維陣列來儲存天平兩邊的硬幣(左右兩邊硬幣數相等且從a到l)和結果(即天平右邊是高還是平還是低),注意這個地方是以天平右邊的高低來判斷輕的硬幣在什麼位置。首先是case數的迴圈,裡面就是對於三個例子的迴圈,最裡面就是對每個硬幣的迴圈,每個迴圈內部是對每乙個硬幣的輕還是重進行列舉。這裡對輕重的判斷放在了乙個函式裡面。這個isfake有兩個引數,第乙個引數就是需要判斷的硬幣,第二個bool型的引數是判斷是不是light。

函式的迴圈內部設計了兩個指標分別指向天平的左端和右段,這裡如果是重的話,交換位置把左指標指向右邊,右指標指向左邊這樣就可以不需要寫兩邊判斷。如果是左邊高的話,且硬幣是輕的,說明輕的硬幣在左邊,strchr是用來判斷字元是不是在字串內,這裡就是判斷硬幣在不在左邊。如果是相等的說明硬幣不能在左邊或者是右邊。如果右邊低說明硬幣在左邊。如果是重的話這些情況交換,這也是為什麼在前面寫上交換的原因。

列舉的簡舉例

列舉的關鍵字是enum package com.haidai.entity 建立列舉類 public enum mycolor 建立測試類 class test 執行結果 redyellow green 獲取列舉類中的元素和值。和普通通的類類似。可以做為關係對映的一種方式來處理。package co...

列舉的簡單例題

描述 給你n根火柴棍,你可以拼出多少個形如 a b c 的等式?等式中的a b c是用火柴棍拼出的整數 若該數非零,則最高位不能是0 用火柴棍拼數字0 9的拼法如圖所示 注意 加號與等號各自需要兩根火柴棍 如果a b,則a b c與b a c視為不同的等式 a b c 0 n根火柴棍必須全部用上 分...

python例題練習

2 有1 2 3 4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?3 輸入三個整數x,y,z,請把這三個數由小到大輸出。4 判斷101 200之間有多少個素數,並輸出所有素數。5 利用遞迴方法求5 6 統計1到100 之和。7 文字進度條 8 中文文字詞頻統計 9 英文文字詞頻統計 1...