机房水题欢乐赛 2016-04-20 下午

由于题目太水。。
一道题都没有打。。

Mobile Service (CodeVS 1383)

service,3 sec,64mb
一个公司有三个移动服务员。如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工)某一时刻只有一个员工能移动。被请求后,他才能移动,不允许在同样的位置出现两个员工。从p到q移动一个员工,需要花费c(p,q)。这个函数没有必要对称,但是c(p,p)=0。公司必须满足所有的请求。目标是最小化公司花费。

输入

第一行有两个整数L,N(3<=L<=200, 1<=N<=1000)。L是位置数 ;N是请求数。每个位置从1到L编号。下L行每行包含L个非负整数。第i+1行的第j个数表示c(i,j) 并且它小于2000。最后一行包含N个数,是请求列表。一开始三个服务员分别在位置1,2,3。

输出

第一行包含一个数M表示最小服务花费。第二行包含N个数,第i个数表示哪个员工执行服务任务(1,2或3)。如果有多种可能,输出任意一种。

样例输入

5 9
0 1 1 1 1
1 0 2 3 2
1 1 0 4 1
2 1 5 0 1
4 2 3 4 0
4 2 4 1 5 4 3 2 1

样例输出

5
1 2 1 2 2 1 3 1 3

Solution

显然是DP

dp[k,x,y,z]dp[k+1,l[k+1],y,z]dp[k+1,x,l[k+1],z]dp[k+1,x,y,l[k+1]]

注意到相当多的不合法状态,考虑改变状态表示
dp[k,a,b] 表示处理到第k个请求,另外两个服务员的位置为a和b
dp[k,a,b]dp[k+1,a,b]dp[k+1,l[k+1],b]dp[k+1,a,l[k+1]]

复杂度 O(NL2) 3s可过。
注意处理题目红色高亮部分
代码的话
http://www.codevs.cn/wiki/solution/?problem_id=1383
这里有

Ticket Office

Ticket,0.5sec,64mb
卖票公司以卖连票取代一张一张卖单票。公司收到了大数量的订单,订单以连续的座椅中最小编号的椅子的编号来表示。公司不能完成所有的订单任务,但是如果准确地完成这些订单 会有很多椅子空着 如果公司接受一个订单,且椅子能被按订单要求的安排,下订单者要付全价(2元)。如果公司接受一个订单,但是安排的位置不同于被请求的位子,那么只要付半价(1元)。安排一个方案最大化总收入。

输入

第一行有整数M, L(1<=M<=30000,1<=L<=100)。M是座位数,L是连续座位的座位数。座位从1到M编号。第二行包含一个整数N (1<=N<=100000)是订单数量。第三行包含N个整数,第i个数z表示订购z到z+L-1的座位。

输出

第一行一个整数S 表示最大收入。第二行包含一个整数Q 表示被接受的订单数量。下面Q行每行有两个数x, y。表示订单x订到了从y开始的L个座位。以订单的y的增序来输出。如果有多种可能,输出任意一种。

样例输入

20 3
7
4 2 10 9 16 15 17

样例输出

9
6
4 1
1 4
2 7
3 10
6 13
5 16

Solution

dp[i]=(a,b) 表示处理到第i个位置时,2元和1元的票数。而且显然尽可能地多选2元是最优的。
因此有

dp[i]dp[i+L]+(1,0)(i)dp[i+L]+(0,1)(otherwise)dp[i+1]

布吉的游戏

Game(.cpp/c/pas)

【题目描述】

布吉有一个棋盘,被分成了n*m个格子,每个格子上有一个蜘蛛。布吉一声令下,所有蜘蛛可以往相邻4个格子移动一步,或者停留在原地。布吉想知道,命令下达后最多有多少个格子是空的。

【输入描述】

多组数据,以EOF结束
每行2个数n,m

【输出描述】

每个数据输出一个数,表示最多空的格子。

【输入样例】

1 1
2 3

【输出样例】

0
4

【数据范围】

100%数据保证:1<=n,m<=40,n*m<=40,数据小于等于5组

Solution

注意到合法状态其实不多。。
可以找规律或状压DP

Photo

【题目描述】

平面上有若干个点,现在要求用最少的底边在X轴上且面积小等A的矩形覆盖所有点,这些矩形可以重叠。
N<=100,A<=2000000

【输入描述】

第一行N,A
以下N行输入点坐标。

【输出描述】

一行,最少矩形数量

【输入输出样例】

Sample Input

6 4
2 1
4 1
5 1
5 4
7 1
6 4

Sample Output

3

【数据约定】

1 ≤ N ≤ 100
1 ≤ A ≤ 200 000
Each point has 0 ≤ x ≤ 3 000 000 and 1 ≤ y ≤ A
For 30% of the test cases, 1 ≤ N ≤ 18

Solution

可以发现,任意两个矩形要不然是不相交,要不然某个在另一个中间而且要更高一些。其他的情况总可以改为前2个情况。

考虑最优方案下,可以用一条竖线将覆盖矩形分成2份,而且不交于任何矩形,那么就根据这条线划分点,而且有N种可能。
如果不能呢就是第2种情况,存在一个矩形覆盖其他矩形的底部而且覆盖所有点的x坐标。

因此我们发现任何有关的初始状态的子集被3条线分离:在2条竖线间,在横线上。令 dp[i,j,k] 表示用最少数目覆盖点 (x,y)(xixxj,yky)
然后

dp[i,j,k]=min{minx=i..j1{dp[i,x,k]+dp[x+1,j,k]},1+dp[ni,nj,nk]}

其中 (ni,nj,nk) 表示边界左边,下边和右边的不被底部的矩形所覆盖的点。

时间复杂度 O(n4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值