2019 03 30測試T3 里程表

2021-09-14 03:35:19 字數 2332 閱讀 2421

傳送門

題目描述:

農民約翰的牛正開始乙個美妙的旅程。牛車的里程表上顯示乙個整數表示里程,旅程開始時里程數為 x

(100≤x

≤1018

)x(100 \le x \le 10^)

x(100≤

x≤10

18),結束時里程數為 y(x

≤y≤1

018

)y(x \le y \le 10^)

y(x≤y≤

1018

)。每當里程表顯示乙個有趣的數時(包括起點和終點數),牛們會發出愉快的叫聲。

對於乙個里程數的每一位,如果有至少一半的數字時相同的,則這個里程數乙個有趣的數。例如:3223

3223

3223

和 110

11011

0 是有趣的數,而 97791

97791

9779

1 和 123

12312

3 則不是。

請計算,整個旅程中,牛們會發出多少吃愉快的叫聲。

輸入格式:

一行兩個數,分別表示 x,y

x,yx,

y。輸出格式:

一行乙個數,表示答案。

樣例資料:輸入

110 133 輸出

14 看到題目就知道這是一道數字d

p\mathrm

dp的題。那在 d

p\mathrm

dp的時候,怎麼來計算有沒有某乙個數字有沒有超過一半呢?(這也是考場上一直困擾我的問題。)

我們可以列舉每個數(0

00 ~ 9

99),就讓這個數超過一半(將這個數設為 x

xx)。

這樣,問題就轉化成了,計算 [l,

r]

[\;l,r\;]

[l,r

] 中,各個位上 x

xx 超過一半的數的個數,這就是一道簡單題了。

然後把 0

00 ~ 9

99 中的答案累加一下就好了。

然後注意兩點:

對於 1919

1919

1919

這樣的數,列舉 1

11 的時候會算一次,列舉 9

99 的時候會再算一次,就會算重,要減去重複的。

注意要除去前導零的影響。

#include

#include

#include

#define ll long long

using

namespace std;

int a[20]

,a,b;

ll f[20]

[20][

20][2

][2]

;ll dp1

(int p,

int num,

int all,

bool lead,

bool limit)

f[p]

[num]

[all]

[lead]

[limit]

=ans;

return ans;

}ll g[20]

[20][

20][20

][2]

[2];

ll dp2

(int p,

int num1,

int num2,

int all,

bool lead,

bool limit)if(

~g[p]

[num1]

[num2]

[all]

[lead]

[limit]

)return g[p]

[num1]

[num2]

[all]

[lead]

[limit]

;int i,up=limit?a[p]:9

;ll ans=0;

for(i=

0;i<=up;

++i)

g[p]

[num1]

[num2]

[all]

[lead]

[limit]

=ans;

return ans;

}ll solve

(ll x)

for(i=

0;i<=9;

++i)

}return ans;

}int

main()

2018 11 05測試T3 相交

傳送門 一道不錯的題 首先,要知道乙個東西,即若兩條路徑相交,則一條路徑的 lca lcalc a 必然在另一條路徑上 我們每加入一條邊,都計算一下之前的邊加上它對答案的貢獻 現在假設加 a,b a,b a,b 條邊,具體有一下幾種情況 統計 a,b a,b a,b 這條路徑上的 lca lcalc...

2019 03 02測試T3 層流

傳送門 題目描述 對於乙個全集 u uu,對於他的兩個子集 a,b a,ba,b,如果 a b a subset b a b 或 b a b ab a 或 a b a b varnothing a b 則這兩個集合就是 u uu 的層流集。現在小 z 想把這個問題搬到樹上來。他給出 n nn 個頂點...

T3進銷存公升級T 備忘

t3進銷存資料公升級t 只能公升級各種基礎檔案和截至某月底的結存數量 不含單價 金額 一 安裝及加密識別 1.1 因為不能公升級歷史業務單據,所以如果要查詢t3的歷史資料,需要在訂購t 時同時訂購t3查詢工具。1.2 t3和t 需要安裝在一台電腦,t3主要查詢,不再做新資料,所以想用高版本sql,也...