ACM-ICPC 2015 Asia Tsukuba Regional

From EOJ Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

ECNU Foreigners

Problem A

Solved by zerol. 00:15 (+)

温暖的签到。

Problem B

Solved by zerol & ultmaster. 00:24 (+)

题意:求最小距离,使得两块板之间可以塞下题给的所有木棍(不能交换顺序)。

题解:贪心往左放即可。依次计算每根木棍最左可以放到哪儿。

Problem C

Solved by ultmaster. 01:39 (+4)

题意:你在一个图上走。每次老大哥会从预先准备好的三个数中挑一个,然后你必须要走这么多步,你只能决定怎么走。你走投无路或者死循环了就输了。求你从起点到终点,在最坏情况下,要几轮?

题解:典型的博弈 DP。然而会有出现环的情况,在某些情况下某些点会算不对。不知道怎么搞……(其实是因为之前有个题没补)

在尝试了若干假算法之后,ultmaster 提出要不把这个东西迭代 1000 轮。然后就……顺利地 AC 了?

Problem D

Solved by kblack. 01:42 (+)

题意:在一个矩形内,每个人有一个直角的视野,在墙上挂钟使得每个人都能至少看到一个钟。

题解:直角视野对应周长上的一个区间,然后就是一个在环上丽娃河装路灯的问题。我们枚举第一个钟的位置,之后贪心地尽量靠后安装。

Problem E

Solved by ultmaster. 03:50 (+)

题意:定义一种带前导零的数之间的全序关系:按照如下三维依次从小到大:数位和、数位加 1 之积、数字本身大小。求在该意义下的 $n$ 位整数中比 $n$ 为整数 $x$ 小的数有多少个。

题解:枚举组合。由插板法,在极限情况下满足第一维和第二维小的也至多 $\binom{23}{9} \approx 8 \times 10^5$,对每种情况用多重组合公式算排列即可。

剩下的要比较数字本身的大小。可以考虑一种数位 DP 和状压 DP 的 mixture。要记录已经用过了哪些位、是否可以随便选。复杂度是 $\mathcal{O} (n 2^n \cdot 10)$。还要乘以满足第一维和第二维的组合有多少个。剩下的问题是,这个东西会不会很多呢?U 大胆认为它不会,但 Z 觉得不大靠谱,所以先占机写了 G。

Problem F

Solved by kblack. 04:22 (+9)

题意:$p$ 个进程,$r$ 种资源,判断从哪一次资源分配后无法靠安排之后的顺序解决死锁。

题解:无法避免死锁的点存在二分性,因为能跑完的进程一定先跑完更好,通过类似 [1] 的方式贪心判断是否能全部跑完,需要注意一些边界情况。

Problem G

Solved by zerol. 03:31 (+)

题意:给一个字符串 s,求所有 s 是其子序列的最短回文串中第 k 大的。

题解:首先用 dp 求出每个区间扩展成回文的最小代价和方案。然后按位枚举求出第 k 大。


One,Two,Three,AK

Problem A

Solved by Xiejiadong. 00:12:07(+)

非常温暖的签到。

Problem B

Solved by oxx1108. 00:31:20(+)

题意:平面上从左到右放圆,问长至少要多少。

题解:枚举每个圆心最左放到哪儿,注意需要和之前所有圆算一下,不能只和左边那个圆算。

Problem C

Solved by oxx1108. 02:34:32(+2)

题意:给一个有向图,两个人博弈,一个人给出步长,另一个人必须走那么多步,问至少几轮走到终点。

题解:将所有必胜态缩为一个点,然后迭代算下一层的必胜态。

忘加层数限制wa了两发。

Problem D

Upsolved by oxx1108 && dreamcloud. (-6)

题意:在一个矩形内,每个人有一个直角的视野,在墙上挂钟使得每个人都能至少看到一个钟。

题解:单纯形法。某人敲错模板导致oxx自闭三小时……

Problem E

Solved by dreamcloud. 01:26:11(+1)

题意:$s$序列含n位,$d_1d_2…d_n$ (都为0~9),

$sum(s) = d_1+d_2+...+d_n$

$prod(s) = (d_1+1) \times (d_2+1)...\times (d_n+1)$

$int(s)$为十进制下大小

定义$s_1 \lt s_2$如下

(1)$sum(s_1) \lt sum(s_2)$

(2) $sum(s_1) = sum(s_2), and prod(s_1) < prod(s_2)$

(3) $sum(s_1) = sum(s_2), and prod(s_1) = prod(s_2), int(s_1) < int(s_2)$

问你有多少个 n长的串比给定的这个串小(每一位是由0~9组成,可以有前导0),大小的定义为:

题解:数位dp模拟一下即可

Problem F

Upsolved by dream_cloud

题意:p 个进程,r 种资源,告诉你每个进程对各个资源的需求。判断从哪一次资源分配后无法靠安排之后的顺序解决死锁。

题解:二分答案,判断是否会导致死锁。判断的话,对每个资源建立一个优先队列(按照每个进程对该资源的需求排序),一开始所有进程都在申请第一个资源,只有需求量小于第一个资源现有量,才能转移到申请第二个资源,依次类推。直到一个进程得到了所有需要的资源,就把资源释放。有一些坑点。

Problem G

Solved by Xiejiadong. 04:24:25(+)

题意:给出一个字符串,补成回文串,所有长度最小的情况中,求字典序为$k$的串。

题解:我们用$f[i][j]$表示字符串$i$到$j$区间变成回文串最小需要多少字符,$g[i][j]$表示最小字符数情况下的方案数。

直接区间dp,要注意重复情况的考虑,对于$s[l]=s[r]$的区间,不要再去用$max(f[l][r-1],f[l+1][r])$更新答案,就可以避免重复。

然后就是贪心了,从外向内一层一层的进去,如果当前的$s[l]=s[r]$,直接进去,否则判断在前半段还是后半段:比如$s[l]<s[r]$,那么前半段就是相对应的补齐$s[l]$对应的一个,后半对就是补齐$s[r]$对应的一个,然后继续向里。

Problem H

Unsolved.

Problem I

Unsolved.

Problem J

Unsolved.

Problem K

Unsolved.