B:Buggy Robot
【题意】
一个n*m的地图(1≤n, m≤50),有一个入口和一个出口。给定一个命令序列(上,下,左,右),如果碰到障碍或者边际就忽略。问至少加入或删除多少个的命令,使得能从入口走到出口。
【题解】
f[i][j][k]表示在位置(i,j),匹配到命令序列的第k项,至少加入或删除多少个的命令。
D:Contest Strategy
【题意】
一场ACM有n题,做第i题要$t_i$的时间。
有n!种读题顺序,做题策略是这样的:
1.先随机读k道题;
2.在读过的题中做用时最少的题(有多个就随便选一个)
3.从没读过的题中随机选一题(如果有的话)
4.如果还有题没有做,跳到步骤2
求n!种情况的罚时之和。
【题解】
这道题可以做到O(n)(不算排序)
容易知道第i个做出来的题系数为n-i+1
容易知道最后做出来的k-1道题一定是用时前k-1大的。
我们从后往前考虑。
先把时间从大到小排序。
改一下规则,如果在读过的题中有多个用时最少,选下标最大的。
记f[i]表示只考虑前i道题时的答案。
f[1]=t[1]
当1<i<=k时,
$f[i]=f[i-1]*i+i!*t[i]*i$
当k<i<=n时,
这道题如果一旦被读过,就一定会立刻做。
我们要算这道题的贡献和它造成其他题罚时的增量。
分两种情况考虑,
1)这道题是第1道做出来的题
2)这道题是第2...i-k+1道做出来的题目
看程序注释
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include
E:Enclosure
【题意】
给定n个点,问用前k个点与剩下的n-k个点建一个凸包,最大面积是多少。
【题解】
建大小两个凸包。大凸包用n个点建,小凸包用前k个点建。
然后在大凸包上跑就行了。
输出时不能强行转成double。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include
H:Paint
【题意】
一个n*n的棋盘上,有l盏灯。每盏灯可以选择在横向或者纵向的方向照,延伸范围为r。
如果一个空格在横向上被超过1盏灯照,或者在纵向上被超过1盏灯照,那么鬼就会被吓跑。
问是否存在一种方案使得鬼不会被吓跑。
【题解】
2-SAT。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include
G:Maximum Islands
【题意】
一块n*m的地图(1≤n, m≤40),有一些点是陆地“L”,有一些点是海洋“W”,还有一些未确定“C”。求出一种方案,使得把所有“C”变成“L”或者“W”后,陆地连通块的个数最大。
【题解】
首先,确定两点:
与“L”的“C”一定不会变成陆地“L”;
新生成的陆地面积一定是1*1
由相邻格子之间相互排斥可以奇偶二分图和最大独立集。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include