AtCoder Beginner Contest 192 题解

ABC192 题解

[toc]

AC代码

A – Star

B – uNrEaDaBlE sTrInG

C – Kaprekar Number

定义了 Kaprekar Number 的运算,给出首项,求第 $N$ 个 Kaprekar Number 。

$N\leq 10^5$ 。

模拟一下,如果遇到循环节直接退出即可。

D – Base n

给定两个十进制正整数 $X,M$ ,询问 $X$ 在 $K$ 进制下小于等于 $M$ 的合法情况有几种?这里的合法情况指 $X$ 在 $K$ 进制下的不同数值数量

例如 $X=22,M=10$ ,$X$ 在三进制下 $=8<10$ ;$X$ 在四进制之下 $=10\leq 10$ ;因此一共 $2$ 个合法的 $X$ 。

$X\leq 10^{60},M\leq 10^{18}$ 。

显然进制越高,那么 $X$ 就越大,于是我们可以二分查找合法区间。注意特判 $X$ 为个位数的情况(不论几进制都是他本身,最多只有一种合法情况)。

E – Train

给定一个 $N$ 个点,$M$ 条边的无向图,每一条边 $i$ 上都运作有一班列车,该班次的列车会在 $K_i$ 倍数的时间从某一个端点发车(双向发车),并且运行 $T_i$ 的时间到达另一个端点。询问从点 $X$ 出发到达点 $Y$ 的最少时间?

$N,M\leq 10^5$ 。$T_i,K_i\leq 10^9$ 。

是一个显然的最短路问题,唯一不同之处在于边权的计算:

运行dijkstra算法时,每到达一个点 $u$ 时假设最短时长为 $T_u$ ,那么从该点到达点 $v$ 的最短时长则为 $\lceil \frac{T_u}{K_{u,v}} \rceil \times K_{u,v}+T_{u,v}$ 。

F – Potion

有 $N$ 个魔力瓶,每个瓶子有 $A_i$ 点魔力,你可以从中选择 $K$ 个瓶子并获得这些瓶子的魔力之和,然后你的魔力每秒会增加 $K$ ,询问你的魔力到达 $X$ (必须严格到达 $X$ ,不能超过)需要的最少时间。

$N\leq 100,A_i\leq 10^7,10^9\leq X\leq 10^{18}$ 。

因为魔力每秒增加 $K$ ,这说明我们如果选了 $K$ 个瓶子,那么 X - 这K个瓶子的魔力和 必定是 $K$ 的倍数中最大的那个,这提示我们可以通过枚举 $K$ 进行dp。

枚举我们最终选了 $K(K=[1..N]$ 个瓶子,假设 $dp[i][j][k]$ 表示前 $i$ 个瓶子中选 $j$ 个,然后对 $K$ 取模后与 $k$ 同余的最大值(因为我们最终取了 $K$ 个瓶子,因此只需要考虑关于 $K$ 的剩余系)。

转移很简单:

\begin{cases}
dp[i+1][j+1][(k+a[i])\bmod{K}]=\max(dp[i+1][j+1][(k+a[i])\bmod{K}],dp[i][j][k]+a[i])\\
dp[i+1][j][k]=\max(dp[i+1][j][k],dp[i][j][k])
\end{cases}

算上枚举 $K$ 的 $O(N)$ ,复杂度合计为 $O(N^4)$ 。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇