【題目描述】
人們選擇手機號碼時都希望號碼好記、吉利。比如號碼中含有幾位相鄰的相同數字、不含諧音不吉利的數字等。手機運營商在發行新號碼時也會考慮這些因素,從號段中選取含有某些特徵的號碼單獨**。為了便於前期規劃,運營商希望開發乙個工具來自動統計號段中滿足特徵的號碼數量。
工具需要檢測的號碼特徵有兩個:號碼中要出現至少 3個相鄰的相同數字;號碼中不能同時出現 8 和 4。號碼必須同時包含兩個特徵才滿足條件。滿足條件的號碼例如:13000988721、23333333333、14444101000。而不滿足條件的號碼例如:1015400080、10010012022。
手機號碼一定是 11 位數,前不含前導的 0。工具接收兩個數 l 和 r,自動統計出[l,r] 區間內所有滿足條件的號碼數量。l 和 r 也是 11 位的手機號碼。
【輸入描述】
輸入檔案內容只有一行,為空格分隔的兩個正整數 l,r
【輸出描述】
輸出檔案內容只有一行,為乙個整數,表示滿足條件的手機號數量。
樣例輸入
12121284000 12121285550
樣例輸出
5樣例解釋
滿足條件的號碼有:12121285000、 12121285111、 12121285222、 12121285333、 12121285550。
對於 30% 的資料,r−l≤10^7
對於 100% 的資料,10^10 ≤l≤r< 10^11
比較裸的數字dp。
我們思考轉移時需要哪些資訊,以及一些需要注意的細節。
題目中說4和8不能同時出現,所以我們需要儲存4和8是否出現過。
必須出現三個以上的相鄰且相同的數。因此我們需要儲存前乙個數是什麼(pre),儲存前乙個數已經連續出現了幾次(num)。
這道題要求了手機號碼必須是11位,因此不能有前導零。
搜尋到末狀態時,我們不清楚是否出現過三個以上相鄰且相等的數,因此我們需要儲存乙個bool來判斷。
是不是很簡單呀!!
#include
#include
#include
#include
#include
#include
#include
#include
#define re register
using
namespace std;
long
long a,b,c,n,m;
long
long len=0;
long
long q[
101]
;long
long lo[
101]
;long
long f[20]
[11][
21][2
][2]
[2];
long
long
dfs(
long
long pos,
long
long pre,
long
long num,
bool law,
bool lim,
bool is4,
bool is8,
bool zero)if(
!lim&&
!zero) f[pos]
[pre]
[num]
[law]
[is4]
[is8]
=ans;
return ans;
}long
long
ask(
long
long x)
return
dfs(11,
0,0,
0,1,
0,0,
1);}
intmain()
數字DP CQOI2016 手機號碼
這題的要求的是組成該數的數字滿足一些條件的數,並且看資料範圍,果斷鎖定數字dp。考場上我寫記憶化搜尋的把自己搞暈了,然後果斷改寫遞推版。f表示 n的滿足條件的 號碼,定義狀態7維 f ff i j f1 f2 f3 l 是否比n小 當前是第幾位 幾個連續 是否3個連續 是否有8 是否有4 當前選擇的...
1002 手機靚號
手機靚號 time limit 1000ms memory limit 65536k total submit 470 accepted 208 description description 小風涼剛買了手機,去營業廳開戶,營業員讓其挑選自己喜歡的號碼,但那麼多的號碼著實讓他眼花,他對號碼的要求是...
1176 手機靚號
1176 手機靚號 description 小風剛買了手機,去營業廳開戶,營業員讓其挑選自己喜歡的號碼,但那麼多號碼著實讓他眼花,他對號碼的要求是在號碼中6和8的個數要不少於5個,並且沒有數字4,於是請你給他編了乙個程式。input 輸入不多於50組的數,手機號碼 每個數以13或15開頭,長為11位...