TopCoder SRM294 DIV2 Report
match date:Saturday, March 25, 2006
report date:Tuesday, March 28, 2006
Preface:
好可惜呀,这次的比赛是有奖金可拿的,但我没能排上前两名,区居小三。
这次我和肖叉一起做的,感觉他很浮躁,不跟我搞配合就算了,还老是影响我。最后他的第二题没能PASS,名次不高。
Challenge环节是我最薄弱的部位呀,要是能Challenge掉一次就能拿一次奖金啦。题目倒不是很难,就是在做第二题的时候头很晕,可能是因为晚上1点做题或者是肖叉在旁边做或者是第一次做有奖金的等等等等。总之,保持好的状态是决定比赛结果的重要因素就对了,要做好的选手还要经常练习如何保持状态呀。
Problem 250 - ThreeCardMonte :
简单得没什么说的模拟题,DIV2第一题总是这么简单。可以模拟三张牌,然后按输入依次换牌,最后输出A的位置就行了。
Problem 500 - Shuffling:
第二题是题意有点难懂,不过做法比较没啥难度的题目。大致意思是,给的两个参数一个是牌的数目,另一个是洗牌的一系列操作。洗牌操作是指,先将牌一分为二(相同的上下两堆),如果操作是a(a>0)则上堆从第a张牌开始与下堆交叉,如果操作是a(a<0)则下堆从第a张牌开始与上堆交叉。就如它所给的图一样。
我的解题思路和赛后的解题报告一样,是对每次操作后求一下ACE所在的位置,即一个输入是洗牌前的位置、参数是操作数、输出是洗牌后的位置。我也看到过有人用模拟洗牌的方法,即用一个数组模拟每张牌,虽然方法有点龊,不过可能需要思考的细节就少了,准确性也比较高。
虽然给了两个洗牌的图,但实际上两种情况可以用同一段代码处理,其操作数为一正一负,正时ACE无论在上堆还是下堆都保持不变,负时ACE在上则可以转为下堆,在下转为上堆处理。用下面代码转换(i为操作数):
if(i<0){
pos=(pos+(cards>>1))%cards;
i=-i;
}
转换后分析可得,若pos小于i,位置不变,若pos大于等于cards-i,位置也不变。只有在中间这一块,pos的值要处理:
if(pos<(cards>>1) && pos>=i){ // 下堆的i上方
pos = ((pos-i) <<1) + i+1; // 从i位置上面2倍pos-i
}else if(pos <(cards-i) && pos>=(cards>>1)){ // 上堆的i张下方
pos = ((pos - (cards>>1))<<1) + i; // 类似地可得pos位置
}
Problem 1000 - Palindromist:
这是一道处理字符串的题目,题目要求是在字符串中添加空格,使得字符串变成若干单词组合的形式。根据题意,用动态规划的方法是再合适不过了:
res [ i ] = best (res [ k ] + word [ j ]) 当k + j = i 时
最后求得的res[len](len是目标字符串长度)就是解了。
Links:
My Blog:
http://blog.csdn.net/ray58750034/
My statistic:
http://www.topcoder.com/stat?c=coder_room_stats&rd=9815&cr=20862220
SRM 289 - Problem Set & Analysis:
http://www.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm294