2017.07.16【NOIP提高組】模擬賽B組 DigitalCounter 題解

原題:

我們有一個N位數(shù)字的電子表掸驱,當時間到達10^N-1時,下一秒就歸0没佑。下面我們給出數(shù)字0 到 9的模擬圖毕贼。


  
對于每個數(shù)字,相鄰兩個+之間會有一根電子管蛤奢,當顯示該數(shù)字時鬼癣,這些電子管就會發(fā)亮陶贼。如上圖所示:數(shù)字0到9,它們的電子管數(shù)量分別是:6待秃、2拜秧、 5、 5章郁、 4丸逸、 5宇色、 6厘熟、 3息堂、 7足画、 5雄驹。  設(shè)現(xiàn)在的時刻是X, 那么可以算出該時有多少根電子管是亮的淹辞。比如:現(xiàn)在時刻是:99医舆,那么共有5 + 5= 10根電子管是亮的。假如從現(xiàn)在時刻開始象缀,再過Y秒后蔬将,時刻顯示為Z, 我們的問題是:求最小的Y,使得時刻Z發(fā)亮的電子管數(shù)量與時刻X發(fā)亮的電子管數(shù)量相等央星。如:現(xiàn)在X = 99 霞怀,那么再過Y = 5 秒后, 時刻變成了Z = 04, 而時刻Z發(fā)亮的電子管數(shù)量 = 6 + 4 = 10。于是Y = 5就是你要求的數(shù)莉给。

輸入:

第一行:一個整數(shù)N毙石,表示電子表是10^N進制的。1 <= N <= 15颓遏。
第二行:一個整數(shù)X, 表示現(xiàn)在的時刻徐矩,可能有前導0。X有N位數(shù)字叁幢。

輸出:

一行:最小的整數(shù)Y, 表示從現(xiàn)在X時刻開始滤灯,再過Y秒,得到的時刻Z發(fā)亮的電子管數(shù)量與時刻X發(fā)亮的電子管數(shù)量相等曼玩。

樣例輸入:

3
007

樣例輸出:

11

樣例說明:

因為數(shù)字007有6+6+3 =15根電子管發(fā)亮鳞骤,所以過11秒后,電子表顯示數(shù)字018時黍判,才能滿足發(fā)亮的電子管數(shù)量相等弟孟。018時刻發(fā)亮的電子管數(shù)量 = 6 + 2 + 7 = 15

數(shù)據(jù)說明:

對于30%數(shù)據(jù),N < 7.

分析:

對于這道題目样悟,很容易的一的想法就是不斷+1拂募,然后判斷是否和原數(shù)相等庭猩,最后相減就是答案,但是這樣肯定會超時陈症,因為數(shù)字的位數(shù)最大有15蔼水,那么再來看仔細看題目,我們需要找的就是第一個比x大的并且電子管數(shù)量相同的數(shù)字(先不考慮超過上限回到0)录肯,那么要比x大并且電子管數(shù)量相同這要怎么做呢趴腋?其實可以發(fā)現(xiàn),從后一位開始改變(改大)论咏,看是否可以變成數(shù)量相同的优炬,如果當前位不可以,繼續(xù)同時改后兩位厅贪,直到可以改變成功蠢护。那么如何快速知道是否可以改變呢?需要一個輔助布爾型函數(shù)f[len,light,i]表示長度為len(從后往前數(shù))养涮,有Light個電子管葵硕,且最前面一個數(shù)字為i時 是否可以構(gòu)成。遞推而來就可以f[len,light,i]:=f[len,light,i]or f[len-1,light-e[i],j](e是構(gòu)成數(shù)字所需要的電子管數(shù)量贯吓,j需要枚舉懈凹,是len-1時的數(shù)字)
舉個例子,對于98765 我們先從最后一位開始找悄谐,發(fā)現(xiàn)不行介评,然后找后兩位,也就是找98766-98799爬舰,看是否可以構(gòu)成相同電子管數(shù)量们陆,發(fā)現(xiàn)不行,再看第二位9868-9869洼专,還是不行棒掠,然后繼續(xù),發(fā)現(xiàn)988**成立屁商,那么第三個數(shù)字就改成8烟很,然后往回推,繼續(xù)改原先的數(shù)字蜡镶,直到改完雾袱,可以遞歸進行,然后把改變的字符串和之前的字符串變成數(shù)字相減就得出答案了
對于超出n位的那么只需要判斷一下官还,然后把答案字符串清0芹橡,從頭開始繼續(xù)上面所做,當然前面部分的答案最后要加上去

實現(xiàn):

const
        e:array[0..9]of longint=(6,2,5,5,4,5,6,3,7,5);
var
        s,x:string;
        i,j,k,l,n:longint;
        bz:boolean;
        a,b,ans,q:int64;
        f:array[0..17,0..107,0..11]of boolean;
        sum:array[0..17]of longint;
procedure dg(x,t:longint);
var
        i:longint;
begin
        if x=0 then exit;
        for i:=0 to 9 do
                if f[x,t,i] then break;
        s[n-x+1]:=chr(i+48);
        dg(x-1,t-e[i]);
end;
begin
        readln(n);
        readln(x);
        s:=x;
        for i:=0 to 9 do f[1,e[i],i]:=true;
        for i:=2 to n do
                for j:=0 to 9 do
                        for k:=e[j] to 7*i+1 do
                                for l:=0 to 9 do f[i,k,j]:=f[i,k,j] or f[i-1,k-e[j],l];
        sum[0]:=0;
        for i:=1 to n do sum[i]:=sum[i-1]+e[ord(s[n-i+1])-48];
        bz:=false;
        for i:=1 to n+1 do
        begin
                if bz or (i>n) then break;
                for j:=ord(s[n-i+1])-48+1 to 9 do
                        if f[i,sum[i],j] then
                        begin
                                bz:=true;
                                break;
                        end;
        end;
        if bz then
        begin
                dec(i);
                s[n-i+1]:=chr(j+48);
                dg(i-1,sum[i]-e[j]);
                val(s,a);
                val(x,b);
                writeln(a-b);
        end
        else
        begin
                s:='';
                for i:=1 to n do s:=s+'0';
                val(x,b);
                q:=1;
                for i:=1 to n do q:=q*10;
                ans:=q-b;
                for i:=1 to n+1 do
                begin
                        if bz or (i>n) then break;
                        for j:=0 to 9 do
                                if sum[n]-(n-i)*e[0]>=0 then
                                        if f[i,sum[n]-(n-i)*e[0],j] then
                                        begin
                                                bz:=true;
                                                break;
                                        end;
                end;
                dec(i);
                s[n-i+1]:=chr(j+48);
                dg(i-1,sum[n]-(n-i)*e[0]-e[j]);
                val(s,a);
                writeln(ans+a);
        end;
end.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末望伦,一起剝皮案震驚了整個濱河市林说,隨后出現(xiàn)的幾起案子煎殷,更是在濱河造成了極大的恐慌,老刑警劉巖腿箩,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豪直,死亡現(xiàn)場離奇詭異,居然都是意外死亡珠移,警方通過查閱死者的電腦和手機弓乙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钧惧,“玉大人暇韧,你說我怎么就攤上這事∨ǖ桑” “怎么了懈玻?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長追逮。 經(jīng)常有香客問我酪刀,道長粹舵,這世上最難降的妖魔是什么钮孵? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮眼滤,結(jié)果婚禮上巴席,老公的妹妹穿的比我還像新娘。我一直安慰自己诅需,他們只是感情好漾唉,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堰塌,像睡著了一般赵刑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上场刑,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天般此,我揣著相機與錄音,去河邊找鬼牵现。 笑死铐懊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的瞎疼。 我是一名探鬼主播科乎,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贼急!你這毒婦竟也來了茅茂?” 一聲冷哼從身側(cè)響起捏萍,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎空闲,沒想到半個月后照弥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡进副,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年这揣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片影斑。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡给赞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矫户,到底是詐尸還是另有隱情片迅,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布皆辽,位于F島的核電站柑蛇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驱闷。R本人自食惡果不足惜耻台,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望空另。 院中可真熱鬧盆耽,春花似錦、人聲如沸扼菠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽循榆。三九已至析恢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秧饮,已是汗流浹背映挂。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浦楣,地道東北人袖肥。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像振劳,于是被迫代替她去往敵國和親椎组。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容