先說一下我對這個題目的態度:
首先這一題是貪心,這個十分明顯,看了一眼其他題解都是十分優秀的貪心,可是大家都沒有想過嗎:你們貪心都是在區間 $ [l,r] $ 上列舉的貪心,雖然每一次可以直接加上 10 的階乘,但你們畢竟是用的 $ int $ , $ long long $ 啊!。這一題得正解複雜度是 $ log_(n) $ 的,不得不說題目的資料範圍給的太小了只有 $ 10^9 $ ,如果按照複雜度,資料範圍甚至可以到 $ 10^ $ 級別,這個時候你們難道還能在區間 $ [l,r] $ 上列舉嗎?(高精怕都要超時!)
所以雖然分類討論十分麻煩,甚至**很長,但它才應該是真正意義上的正解啊!(當然,考場見機行事)
好的,不做「推銷」了,我們進入正文。
首先這一題,我們可以用字串的方式讀入兩個端點值。然後如果我們仔細讀題,就可以發現一些貪心方案:
我們要讓最終的**數的高位上不是0的數盡可能的少!(當然,要在末尾全是0的基礎上)
只有當不是0的數確定下來,我們再來判斷最後乙個不是0的數能否為5!
如果最後乙個不是0的數不能為5,我們就要讓最後乙個不是0的數盡可能的小!
讓最終得到的**數盡可能的小!
開始討論之前先讓你們有個思維準備:先看看下面**有多少個 $ continue $ ,我們大概就要講多少種情況。首先我們準備乙個快寫函式:將字串 $ s $ 前 $ j-1 $ 位輸出,然後將第 $ j $ 為換成字元 $ k $ ,再輸出 $ n $ 個0
然後為了涵蓋多種情況,我們發現如果兩個數的長度不一樣,是很難討論的。於是我們分三種情況:(兩個數長度差了2位或以上)(兩個數的長度差為1)(兩個數長度相同)
兩個數長度差了2位或以上:(這個想一下,我們發現只有兩種情況
如果較小的數的最高位比5小,就換成5輸出(要特判5,50,500,5000......)
否則將較小的數的最高位換成5,再乘上10輸出。
兩個數的長度差為1:(比上面要多一種情況)
如果較小的數的最高位比5小,就換成5輸出(要特判5,50,500,5000......)
如果較大的數的最高位大於等於5,將較大的數的最高位換成5,輸出。
將較小的的數的最高位上的數加1,然後全接0.(要特判如10,60,300等(高位不用加1))
兩個數長度相同:這個我們仔細想一下就會發現如果這兩個數的高位相同,那麼這些相同的高位可以直接輸出了,所以我們放個迴圈 $ o(n) $ 找到不同的那一位,然後我們發現這一位後面的數可以忽略了(一定會被填成0的,因為貪心第一點:要讓最終的**數的高位上不是0的數盡可能的少)而針對這一位能否填成5,我們又有四中情況:
這兩個數完全相同,這個直接輸出
較小的數的這一位小於5,較大的數的這一位大於5,將這一位改成5輸出(不需要特判5,50...這個歸到下一類)
較小的數這一位後面全是0,直接輸出
較小的數這一位後面不全是0,將這一位+1,然後輸出。
平心而論:這一題情況並不算多(詳見豬國殺)
對了,我們上文有提到一些需要特判的東西,這個只需要,在開始時用乙個變數 $ f $ 來記錄較小的數從那一位開始之後全是0即可!
#include#include#include#include#define rg register int
using namespace std;
int t,a,b,f;
char l[11];
char r[11];
inline void qw(char s,int j,char k,int n)
int main()
qw(l,0,'5',a+1);continue;
}if(b-a>0)
if(r[0]>='5')
if(f==0)
qw(l,0,l[0]+1,a);continue;
}int i=0;while(l[i]==r[i]&&i<=a)++i;//找到不同的哪一位
if(i>a||f='5')
if(f==i)
qw(l,i,l[i]+1,a-i);
}return 0;
}
HEOI2015 定價 解題報告
問題描述 在市場上有很多商品的定價類似於 999 元 4999 元 8999 元這樣。它們和 1000 元 5000 元和 9000 元並沒有什麼本質區別,但是在心理學上會讓人感覺便宜很多,因此也是商家常用的 策略。不過在你看來,這種 十分荒謬。於是你如此計算乙個 p p 為正整數 的荒謬程度 1 ...
HEOI2015 兔子和櫻花
題目傳送門 有一棵樹,裡面有很多點,每個點上有乙個櫻花量 a i a i a i 然後他的兒子數為 son i son i son i 刪除點以後這個點的櫻花和兒子都會繼承給他的父親,問最多刪除多少點,能滿足刪除的點的父親滿足 a i so n i m a i son i leq m a i s o...
HEOI2015 兔子與櫻花
一棵 n n le2 times10 6 個點的樹,每個點有乙個重量 c i 和乙個載重上限 m 刪除乙個結點時,將自身的重量加到父結點上,並將所有子結點連到父結點上。問若要保證對於任意乙個結點,子結點數與重量之和 le m 時,最多刪去幾個結點。自底向上貪心,子結點按照 c i 排序,能刪除的盡量...