列舉演算法
什麼是列舉?
列舉,顧名思義,就是用最笨的方法,去解決問題(暴力列舉),乙個集的列舉是列出某些有窮序列集的所有成員的程式,或者是一種特定型別物件的計數。這兩種型別經常(但不總是)重疊。
列舉演算法是我們在日常中使用到的最多的乙個演算法,它的核心思想就是:
列舉所有的可能
列舉法的本質就是從所有候選答案中去搜尋正確的解,使用該演算法需要滿足兩個條件:(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,intb)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#includeusing
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 ...
演算法 列舉策略
列舉法的基本思想 列舉法的基本思想是根據提出的問題列舉所有可能狀態,並用問題給定的條件檢驗哪些是需要的,哪些是不需要的。能使命題成立,即為其解。列舉結構 迴圈 判斷語句。列舉法的條件 雖然列舉法本質上屬於搜尋策略,但是它與後面講的回溯法有所不同。因為適用列舉法求解的問題必須滿足兩個條件 可預先確定每...