Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

DYGG's contest 12解题报告

Posted by tdzl2003 at 2006-10-15 14:50:08
http://acm.tdzl.net:83/JudgeOnline/showcontest?contest_id=1016

A Gardon's box I
1-n按顺序入栈,要求列出所有可能的出栈序列。
n<=10,DFS即可。每次有入栈和出栈两种选择。优先选择出栈可以得到字典序的排列。
也可n!生成排列再每次O(n)进行判断。

B Gardon's box II
问题同上,求所有可能性的总数。
我的解法是将这个问题等同于如下问题:
若干人买票,有些人手持50元的钱,有的人手持100元的钱,售票员一开始没有零钱找,问有多少种排列方法。
这个问题首先由C(2n,n)种排列中,有若干不合法的排列,将任一不合法的排列第一个不合法位置之后的所有拿50元的换成100元,拿100元的换成50元,即得到一个n-1个50元和n+1个100元的排列。并且任一这种排列也可以用相同方法得到之前问题的不合法排列。
所以,原问题的所有合法排列数为:C(2n,n)-C(2n,n-1)或者C(2n,n)/(n+1)

C Gardon's box III
给任一入栈顺序,要求出栈顺序按照字典序第k大的排列。
解法是从第一个元素开始直接计算出每个位置应该的值。
设函数B(i,j)表示栈中有i个元素,并且还有j个元素没有入栈的所有排列数,则对于每一个位置可以轻易计算出选择某一个数时所有的排列总数c。此时将k不断减去c直至k小于等于c,就可以确定出这一位置的数字。

D Gardon's box IV
三维空间的九宫问题,问是否有解。
方法是判断逆序数和0的三个坐标之和的奇偶性。任意一次移动(相当于交换两个元素)必然带来逆序数奇偶的改变,同时0的三个坐标之和的奇偶性也会改变。并且可以构造证明当有两个以上边长大于等于2时,一定有解。
要考虑的特殊情形就是两个方向的边长都是1的时候,譬如
1 1 4
1 2 3 0
3 1 2 0
不能根据逆序数来判断,而应该将0去掉以后比较剩下所有元素,依次相等才有解。

E Clean the house
三分图匹配,DFS可以过,也可以模仿二分图匹配用增广法求解。

F Apple
概率题,两个人玩游戏,B每轮赢得几率为p,A持有a个苹果,b持有b个苹果,每轮败者给胜者1个苹果,直至其中一人手里没有苹果。问游戏平均要经过多少轮才能结束。
可列出如下等式,设f(i)为B持有i个苹果时的期望值,则有
f(i)=(1-p)f(i-1)+pf(i+1)+1
并且f(0)=f(a+b)=0
可二分搜索f(1)并确认f(a+b)的值,不过实践证明精度很低。我的解法如下:
设f(i)=k(i)f(1)+t(i)
则有
k(0)=0 t(0)=0
和
k(1)=1 t(1)=0
最后解出k(a+b)和t(a+b),则直接可得出f(1)=-t(a+b)/k(a+b)
然后直接将k(b)和t(b)带入求出f(b)即可。

G Garra Fibonacci
F(0)=a F(1)=b F(i)=N,并且对于0<=i F(i)都是非负整数,给出i和N,问有多少组可能的a。
设f(i)为fibonacci序列,并且设f(-1)=1 则有
F(i)=f(i-1)a+f(i)b
首先用扩展欧几里德求出一组ax+by=1(其实x和y的绝对值就是f(i-1)和f(i-2)),然后将它乘上N,再通过取余得到a最小的非负解(每当a增加f(i),b就要减少f(i-1))
此时如果b是负数,则无解,否则b/f(i-1)取整+1即为最终解。

H Gauss Pascal Number
对所有的j<n and (i+j)=0 mod m求C(i,j)
首先看对某一行第k行(也就是C(k-1,j)行,先假设k%m==0)
设i^m=1,则(1+i)^n的常数系数即为所有对应项之和。该乘法可以表示成如下矩阵A的幂:
1 1 0 ... 0 0
0 1 1 ... 0 0
0 0 1 ... 0 0
.     ... . .
.     ... . .
0 0 0 ... 1 0
0 0 0 ... 1 1
1 0 0 ... 0 1
其实若k%m==0,该行所有对应项之和就是该矩阵乘积左上角元素。若k%m!=0,其实取出第一行第((m-k)%m)项即可。
所以,对于不同行的偏移情况,构造轮换矩阵C
0 0 0 ... 0 1
1 0 0 ... 0 0
0 1 0 ... 0 0
.     ... .
.     ... .
.     ... .
0 0 0 ... 1 0
左乘即可。
因此构造矩阵:
A I
O C
求n次幂,将右上角矩阵取出,补上C的(m-(n%m))%m次方(或者直接取出对应项)即可。
这样就避免了复杂度里出现N,总复杂度m^3*log n

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator