方法①
資料1<=n<=1000000,時間複雜度最大o(1000000*6)
暴力足夠了,於是,便開始碼暴力:
迴圈列舉i,將i轉為字串,每一位的判斷是否超過k:如果每一位都沒超過就+1
方法②動態規劃
找一找每一位於上一位的關係,可以發現。
設n=236,k=5,如果最後一位的數x大於k,則上一位數,只能取3+1種,所以(k+1)*f[i-1]
設n=234,k=5,如果最後一位x小於或等於k,則上一位數,能取x種,所以g+x*k
方法①**:
var n,k,i,j,o,l:longint;
s:string;
begin
readln(n,k);
for i:=1
to n do
begin
str(i,s);
o:=0;
for j:=1
to length(s) do
if ord(s[j])-48>k then
begin
o:=1; break;
end;
if o=0
then inc(l);
end;
write(l);
end.
方法②**:
var n,k,x,g,f:int64;
begin
readln(n,k);
f:=1;
g:=1;
while n>0
dobegin
x:=n mod
10; n:=n div
10; if x>k then g:=f*(k+1)
else g:=g+f*x;
f:=f*(k+1);
end;
write(g-1);
end.
2017 6 4 入門組 NO 6 樹
80 做不出100 先來個80分水法 首先將x,y之間有邊的記錄兩個,存在a陣列裡,乙個是x,y,另乙個是y,x 然後將這個a陣列排序,將a i,1 按公升序排序。then 就可以求出每乙個點與多少個點有邊,求出每乙個點的 子點 的區間,用l和r陣列存 再用dfs求出以1作根,每乙個點的father...
2017 6 4 入門組 NO 4 猜數
這題就是求乙個區間 l.r 那開始將l 10000 r 10000 每次輸入一次判斷,如果為 n 那麼就將符號反轉,如 那麼符號處理好後,如果為 或 那麼如果當x大於l且小於或等於r,則l x 如果當x大於r,則輸出 impossible 如果為 如果當x小於l,則輸出 impossible tip...
NOI Online 1 入門組 魔法
全網都是矩陣快速冪,我只會倍增dp 其實這題與 acwing 345.牛站 還是比較像的,那題可以矩陣快速冪 倍增,這題也行。先 floyd 預處理兩點之間不用魔法最短距離 d 複雜度 o n 3 然後預處理兩點之間至多用乙個魔法的最短距離 w 初始為 w d 列舉 i,j 和一條邊 u,v,t w...