衡陽八中1026windy數解題報告

2021-06-03 19:44:23 字數 1665 閱讀 3504

windy定義了一種windy數。不含前導零且相鄰兩個數字之差至少為2的正整數被稱為windy數。windy想知道,在a和b之間,包括a和b,總共有多少個windy數?

包含兩個整數,a b。

乙個整數。

【輸入樣例一】

1 10

【輸入樣例二】

25 50

【輸出樣例一】

9【輸出樣例二】

20【資料規模和約定】

20%的資料,滿足 1 < = a <= b <= 1000000 。

100%的資料,滿足 1 < = a <= b <= 2000000000 。

解題報告和**都在code裡:

/*

如果沒有看范神的**的話,我會因為上下界的處理寫乙個很繁的**,比如昨天比賽的那幾道題。經過范神**的啟發,加之乙個小修改優化了一維的時間複雜度。

思路如下:

先預處理出dp,dp[i][j]表示長度為i+1,並且第乙個數字為j的總數。

之後對於每組資料[a,b],用[0,b]裡的總數-[1,a-1]裡的總數。

所以接下來的任務就是求[0,n]裡的總數,程式裡find函式實現。[0,n]可以等價轉化為[0,n+1),這個轉化在下面可以看到其巧妙之處。

find實現過程:

find(n)求的是[0,n)裡的總數

設n各位分別為a0 a1 a2... ak ( a0 > 0 )

則可以拆解為求以下幾個範圍的總數的和:

[ 0 0 0 0...0, a0 0 0 0... 0)

[a0 0 0 0...0, a0 a1 0 0... 0)

[a0 a1 0 0...0, a0 a1 a2 0... 0)

[a0 a1 a2 0...0, a0 a1 a2 a3... 0)

...[a0 a1 a2 a3...0, a0 a1 a2 a3...ak)

觀察每個區間,字首固定後,字尾都是某個滿區間,比如第二行,a0固定後,只用求字尾[0,a1 0 0 0..0),而這個樣子又和第一行相似

比如第三行,a0,a1固定後,只用求字尾[0,a2 0 0 0...0),這個樣子和第一行相似

於是乎,處理這些區間都是乙個相似的過程:

由字首推導出現在的狀態(設字首為a0 a1 a2 ... ai),然後加上dp[k-i][j],0 <= j < ai+1,j還要符合題意裡的約束條件。

此時只需要兩層迴圈就可以求出結果了。

要注意的是,某個字首已經不符合條件時,之後的區間就不用列舉了。

另外在求第一行那個區間時,由於最高位非0的問題,不能dp[i][0]了事,而要列舉dp[i][1..9]的和。

**如下:

*/#include #include #include using namespace std;

int dp[15][10];

int abs(int a)

//dp預處理出來

void dp()

int find(int n)

int main()

return 0;

}//此題的思路是hdu3565bi-peaknumber的前導,這個思想只是處理了上界,同理可以拓展到處理下界

高階題目:

hdu3565 bi-peak number及

結題報告

八中 7數碼

時間限制 1 sec 記憶體限制 128 mb 注 有需要的同學可以看看八數碼問題,或許,會有更大的驚喜。有乙個4 2的方框,裡面隨機填充著0 7這8個數。每次可以交換0和它相鄰的格仔裡的數。比如 可以變換為 也可以變換為 最終希望8個數整齊地排列為 給出t組初始狀態,求出每種狀態移動到目標狀態的最...

八中測試 優化延遲

小ho編寫了乙個處理資料報的程式。程式的輸入是乙個包含n個資料報的序列。每個資料報根據其重要程度不同,具有不同的 延遲懲罰值 序列中的第i個資料報的 延遲懲罰值 是pi。如果n個資料報按照 pi1,pi2,pin 的順序被處理,那麼總延遲懲罰 sp 1 pi1 2 pi2 3 pi3 n pin 其...

八中足球賽

八中足球賽 description 八中在辦一次足球錦標賽,有n個隊伍參加,每個隊的編號為1到n中某個值。每個隊有個特徵值為1 2 30 1之間的整數,且各不相同 比賽在決出冠軍後就結束了 小z發現每次比賽的興奮值為兩個隊特徵值的異或值 異或可理解為不進製的二進位制加法運算 例如特徵值為2與特徵值為...