TopCoder SRM287 DIV2 Report
match date:Saturday, February 4, 2006
report date:Thursday, February 09, 2006
Preface:
这是第一次参加TopCoder,手法比较生疏。虽然三题都是赶在结束前提交的,但准确率很低,所以不但给了别人一次challenge,而且System test后只留下了一题。不过运气还好,因为problem-600是条件比较烦的题目,problem-1000是有点难度的dp,两题答对的人数很少,所以这次的排名是比较不错的。在room里是第二,得分276.36,包括第一题226.36和challenge 50分,rating是一下子拿了1521,爽哦。
Problem 250 - CustomerStatistics:
最简单的模拟题,解决方法也很多样。我的方法是用Hashmap<String,Integer>记录每个字符串出现的频率。然后对输入的字符串数组排序,循环将出现频率大于1的字符串放入结果数组,并从map中删除该字符串。
看过别人的代码,觉得用Treemap是最省事的。
Problem 600 - TwoEquations:
仔细~仔细~再仔细,这个一道很烦的数学题。这题我是在最后几分钟被chanlleng的,虽然整个DIV2 还没人是过的。
题目是求线形方程组解,容易忽略的是 0x+0y=2 和0x+0y=0 应该是无解,但如果没有提前判断会认为是有多解。
对方程组 ax+by=c ex+fy=g 解题思路如下:
提前判断 a=0 b=0 c!=0或者 e=0 f=0 g!=0 成立,成立则无解。
求 t1=c * f - g * b, t2=f * a - b * e, t3=g* a - c * e
t1-t2=0 并且 t3-t2=0 则多解
t2=0 无解
t2<0 则 t1=-t1 t2=-t2 t3=-t3
取t1 t2 的 gcd,然后约去gcd,就得到 x= t1/ t2
取t3 t2 的 gcd,然后约去gcd,就得到 y= t3/ t2
Problem 1000- FixedSizeSums:
比较难的题目,要求会使用dp,在PKU上有类似的题目2522(序列有点不同)。
考虑c(n,k,m) 表示 n个数分成k份以m开头的个数,求到这个就能快速求得下标是index的划分了。
dp方程是 c(n,k,m)=∑
i=(1,n-m) c(n-m,k-1,i) for all j c(j,1,j)=1
然后循环得比较index是在哪个c(n,k,m)内,取该m ,然后n-=m,k--再求,直到k=0。
Links:
My statistic:
http://www.topcoder.com/stat?c=coder_room_stats&cr=20862220&rd=9808&rm=247563
SRM 287 - Problem Set & Analysis ('s' in Static should be capitalized)
http://www.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm287
PKU 2522
http://acm.pku.edu.cn/JudgeOnline/showproblem?problem_id=2522