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與特徵值為...