原題:
我們有一個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.