C 列舉演算法

2022-05-17 15:15:30 字數 3319 閱讀 7574

列舉演算法

什麼是列舉?

列舉,顧名思義,就是用最笨的方法,去解決問題(暴力列舉),乙個集的列舉是列出某些有窮序列集的所有成員的程式,或者是一種特定型別物件的計數。這兩種型別經常(但不總是)重疊。

列舉演算法是我們在日常中使用到的最多的乙個演算法,它的核心思想就是:

列舉所有的可能

列舉法的本質就是從所有候選答案中去搜尋正確的解,使用該演算法需要滿足兩個條件:(1)可預先確定候選答案的數量;(2)候選答案的範圍在求解之前必須有乙個確定的集合。

接下來幾道題可以讓你更加的了解列舉

1.樓層編號

題目描述:

小林在noip比賽期間住在「新世界」酒店。和其他酒店不一樣的是,這個酒店每天都有乙個高能的數字t,這個數字在樓層中是不會出現的,以t=3為例,則3、13、31、33等樓層是不存在的,樓層編號為1,2,4,5,……所以實際上的4樓才是3樓

已知小林預定了編號為m層的房間,並且當天高能數字是t,現在他想知道房間所在的真實樓層是多少12

34輸入描述

一行兩個整數m和t,1<=m<=100000,0<=t<=9,保證m對t合法

1輸出描述

一行乙個整數,表示真實樓層

1樣例輸入

14 3

樣例輸出

思路:1.包含這個高能數字的樓層一定不會出現,則有演算法如下

bool s(int a,int

b)a/=10;}

return

true

;}

2.用for迴圈對sum進行累加,若不包含高能數字(即s(i,高能數字)=true)則sum++

for(int i=1;i<=m;i++)

}cout

<

**:#include using

namespace

std;

bool s(int a,int

b)a/=10;}

return

true;}

intmain()

}cout

}

2.冰壺比賽

題目描述:

在冰壺比賽中,給出乙個目標點p以及乙個規定的正整數r。每一局由甲和乙兩隊輪流投冰壺各8次後,該局比賽結束。此時,哪一方的冰壺最終離目標點p更近,該方得分,另一方不得分。得分方每顆離目標點p距離小於或等於r、位置較另一隊所有冰壺都更接近目標點p的冰壺都可以得1分

比賽最多進行10局。雙方之間的某局比賽結束後,落後一方可以棄權。此時,比賽不再進行下去

已知每一局結束時,雙方的每個冰壺離目標點p的距離以及正整數r,請寫乙個程式判斷兩隊之間每一局比賽的得分,以及總得分

輸入:第一行乙個正整數r

以下有若干行(不超過20行),每一行8個正整數(之間用乙個空格間隔)

第二行的第j個數表示第一局比賽結束時,甲方的第j個冰壺距離目標點p的距離

第三行的第j個數表示第一局比賽結束時,乙方的第j個冰壺距離目標點p的距離

……第2k行的第j個數表示第k局比賽結束時,甲方的第j個冰壺距離目標點p的距離

第2k+1行的第j個數表示第k局比賽結束時,乙方的第j個冰壺距離目標點p的距離

如果有一方中途棄權,則最後一行(偶數行)只有乙個整數-1,表示此時發生棄權情況

輸出:輸出若干行,每行兩個整數,中間以乙個冒號間隔,表示每一局比賽甲乙雙方的比分(甲得分在前)。最後一行有2個整數,中間以乙個冒號間隔,表示甲乙雙方比賽的最終得分(甲得分在前)

意思就是,先輸入乙個「標準」r,有10場比賽,每場比賽打8次,取最好成績(最近的也就是最小的),再與對手最好成績比較,比對手低的話一定不得分,比對手高的話還要比標準要小或等於才算得分,也就是說,每場比賽的得分,一定有一方不得分,有可能出現都不得分的情況,若棄權的話直接輸出後return 0;即可。最後輸出總的比分(計數即可)12

3主要還是列舉

樣例輸入

5 60 25 74 71 100 3 93

66 75 70 66 52 73 67 14

93 84 74 99 79 64 89 22

65 5 95 59 80 8 35 61

65 61 49 60 58 50 32 85

68 38 96 38 82 64 26 93

74 92 47 21 97 30 45 78

44 99 90 27 3 46 55 34

49 45 83 3 18 1 67 23

60 47 95 81 17 1 87 85

18 74 74 84 29 20 27 71

37 60 26 56 23 65 67 49

57 7 62 92 52 5 10 69

46 97 88 28 76 27 66 7

89 89 94 31 11 20 1 17

19 48 35 6 77 61 45 21

52 11 76 70 73 99 85 55

90 25 20 7 64 24 94 4

3 43 32 74 10 93 35 77

77 100 63 91 10 73 22 57

樣例輸出

2:00:2

0:00:1

0:00:0

1:01:0

0:21:0

5:5

樣例解釋:

可以看到標準為12,

第一局,甲最低3,乙最低14,3<14&&3<=12,甲得分,乙不得分

第二局,甲最低22,乙最低5,5<22&&5<=12,乙得分,甲不得分

第三局,甲最低32,乙最低26,都沒有小於等於標準,都不得分

**

#include#include

using

namespace

std;

intmain()

}for(j=1;j<=8;j++)

for(j=1;j<=8;j++)

}for(j=1;j<=8;j++)

}if(min}cout

<':'

zf=zf+f;

f=0;

}else

if(min1}cout

<':'

zf1=zf1+f1;

f1=0;}

else

min=10000

;min1=10000;}

cout

<':'

}

這裡用到了求最小值的方法,還可以改成sort排序後的[0]

C 列舉演算法

列舉法,即對於問題所求,對所有與之相關的事物一一枚舉,樸素地暴力地解決問題。適用性非常廣泛,理論上能計算出所有求值問題 求解問題 計數問題 動態維護問題等問題的答案 優點 容易理解,容易實現,保證正確性,適用性廣 缺點 效率低下 騙分過樣例,暴力出奇蹟 爆搜掛著機,打錶出省一 n 方過百萬,暴力踩標...

C 校驗演算法列舉

以下是工作中常用的幾種校驗演算法,後期將不斷更新 和校驗 cs和校驗 要進行cs和校驗的byte陣列.system.byte.public static byte cschecksum byte bytestocalc 實際上num 這裡已經是結果了,如果只是取int 可以直接返回了 return ...

演算法 列舉策略

列舉法的基本思想 列舉法的基本思想是根據提出的問題列舉所有可能狀態,並用問題給定的條件檢驗哪些是需要的,哪些是不需要的。能使命題成立,即為其解。列舉結構 迴圈 判斷語句。列舉法的條件 雖然列舉法本質上屬於搜尋策略,但是它與後面講的回溯法有所不同。因為適用列舉法求解的問題必須滿足兩個條件 可預先確定每...