Southeastern Europe 2007 解题报告

Southeastern Europe 2007 解题报告


A . John

PKU 3480 http://poj.org/problem?id=3480

题意:N堆石子,两人轮流从其中一堆中取任意石子,最后一个取完石子的人输。

题解:博弈。

1) 当所有石子的SG值异或和不等于0时:

a) 个数大于1的堆数=0,必定是奇数个1,所以先手必输;

b) 个数大于1的堆数=1,总能想办法将局面变成奇数个1,所以先手必胜;

c) 个数大于1的堆数>1,总能取掉某些石子,使得所有石子的SG值异或和为0,并且个数大于1的堆数至少还剩两堆;

2) 当所有石子的SG值异或和等于0时:

a) 个数大于1的堆数=0,必定是偶数个1,先手必胜;

b) 个数大于1的堆数=1(不存在);

c) 个数大于1的堆数>1,无论怎么取,SG值异或和都不可能为0。并且无论先手怎么移,后手可以要么进入偶数个1的状态,要么保持SG值和为0并且非全1的状态(该状态先手必输),所以这种情况,先手必败。

由于1) 的c)情况可以到达2的c)情况,所以1的c)情况为先手必胜点。

 

B . Double Queue

PKU 3481 http://poj.org/problem?id=3481

题意:给定一些数据(K,P)和一些询问,K为数据值,P为优先级,每次询问输出当前优先级最高或者最低的数据的K的值,询问完删除这个数据。

题解:平衡树。

可以用SLT的set(内部也是平衡树的实现)水过去。

 

C . JBC

PKU 3482 http://poj.org/problem?id=3482

题意:进制转换,数字位可以是任何的可见ASCII码,求所有可能进制下的串转换成十进制后的和。

题解:模拟进制转换,模拟大数运算。

 

D . Loan Scheduling

PKU 3483 http://poj.org/problem?id=3483

题意:给定N(N <= 10000)个任务,每个任务是一个二元组(Pi, Di),表示如果在[0, Di]的某个时刻内完成则可以得到Pi的利润,每个时间点最多只能有L(L <= 100)个任务,求取一个任务子集来完成的的最大利润总和。

题解:贪心。

初始化每个时间点的可用任务数为L,初始化任务利润和S。

将所有任务按Pi从大到小排序,对于每个任务,从Di到0枚举它的完成时间t,如果t这个时间点还有可用任务,累加Pi到S,并且将t这个时间点的可用任务数减1,枚举完所有任务后S即为所求。

 

E . Showstopper

PKU 3484 http://poj.org/problem?id=3484

题意:给定一些三元组(X, Y, Z),一个三元组表示满足X + K*Z <= Y (K = 0, 1, 2, 3 ... ) 的所有正整数 X + K*Z出现了一次。对于多个三元组,保证所有数中至多只有一个数出现奇数次,求这个数以及它出现的次数。

题解:二分答案。

对于出现奇数次的那个数T,那么如果小于T的所有数的和必定是偶数,大于等于T的所有数的和必定是奇数,利用这一点可以二分枚举这个T,然后利用所有小于等于T的数的个数的奇偶性进行二分判定。

对于某个三元组(X, Y, Z),小于等于T的个数分几种情况讨论:

1) 当T >= Y,个数为 (Y-X)/Z + 1;

2) 当T < X,个数为0;

3) 当 X <= T < Y,个数为 (T-X)/Z + 1;

每次枚举T,将所有区间的数相加判断奇偶性即可。

 

F . Highway

PKU 3485 http://poj.org/problem?id=3485

题意:给定一条高速公路的长度L(范围为0到L)和N个村庄,要求在高速公路上建一些出口,使得每个村庄到高速公路至少有一个出口的距离不大于D,并且出口总数最少。

题解:贪心。

计算出每个村庄到高速公路距离D范围内的左右区间[Li, Ri],对这些区间进行排序,排序规则为如果左端点一致则按照右端点递增排序,否则按照左端点递增排序。然后按左端点递增枚举每个区间(每个区间对应一个村庄),对于尚未有高速公路可达的村庄,在其右端点建立一个出口(贪心所在,因为是从左往右扫描,所以在右端点建出口肯定比左端点建更优),然后将它之后的左端点坐标小于这个出口的区间全部hash掉(因为那些村庄可以用这个出口,无须建立新的出口),直到所有区间枚举完毕,出口数也就得出了。

 

G . Computers

PKU 3486 http://poj.org/problem?id=3486

题意:故事背景是每年都要更换电脑或者进行一次维修,如果换电脑需要c的花费,如果不换电脑,那么第y年到第z年( 1 <= y <= z <= n)的总维修费用为m[y][z],求经过n年的最小花费。

题解:动态规划。

DP[i]表示经过i年的总开销,假设从第j年开始买了一台新的电脑,一直用到了第i年,那么前j年的总开销为DP[j],从第j+1年到第i年的维修开销加上购买花费c,即DP[j] + m[j+1][i] + c,DP[i]就是这些开销中的最小值,即。

DP[i] = min{ DP[j] + m[j+1][i] + c, 0 <= j < i };

 

H . The Stable Marriage Problem

PKU 3487 http://poj.org/problem?id=3487

题意:n(n < 27)对男女,每个男人有对所有女人的好感度,每个女人也有对所有男人的好感度,A对B的好感度记为G(A, B), 求找出一种稳定的婚配关系,使得对于任意一对夫妇X(M, W),不存在 G(XM, YW) > G(XM, XW) 并且 G(XW, ZM) > G(XW, XM),并且要求男士优先考虑(即男方如果能找到好的一定不会更差的)。通俗的讲,就是XM更加喜欢别人的老婆,Xw更加喜欢别人的老公,这样的婚姻是不稳定的,双方都有可能出现外遇。

题解:稳定婚姻经典算法。

由于是男士最优,所以需要模拟男士求爱的方式。

用L[i][j]表示i号男子喜欢的第j个女子的编号;

用R[i][j]表示i号女子对j号男子的评分(越大评分越高,且对于确定的i肯定互不相同);

算法如下:

1) 将所有的男子以及他们向多少个女人求过婚的信息入队,每次弹出一个男子M,找到他下一个要求婚的对象(求婚顺序按照对女生的好感度顺序进行)。

a) 如果当前求婚对象W没有配偶,直接配对,记Match[ W ] = M;

b) 如果当前求婚对象有老公,即Match[ W ],那么检查M 和 Match[ W ]在W的评分,如果M的评分大于W的老公,则迫使其改嫁,前夫入队,Match[ W ] = M;否则,该男子M继续入队;

2) 反复进行1)直到所有人都找到的对象。

 

I . Arne Saknussemm

PKU 3488 http://poj.org/problem?id=3488

题意:简单字符串模拟。

题解:根据题意做就行了。

 

 

 

 

你可能感兴趣的:(Southeastern Europe 2007 解题报告)