这场就是彻头彻尾的悲剧。就算是在莫斯科城下寒风中瑟瑟发抖的德军,也及不上我们这组的悲惨。
250P
给出平面上一个点集S,在平面上找一个点V。
V对于S中每个点v0,v1,v2....vn,各自有一个曼哈顿距离。顺便说一句,tc的出题者还真是会赶时髦,他们代表了先进算法的发展方向。
让排序之后得到的Kth曼哈顿距离最短。求此距离。
其实结论很简单:最短曼哈顿距离一定是0.5的倍数。但是我就想不出证明啊。。
500P
推一个比特串。每天只能改变比特串中某些1为0,或是改变某些0为1,而且满足两个条件:
1.每天的比特串都不能和之前的重复。2.在满足条件1的前提下每天都要最小。
这个题是一道分形水题,太阳,比赛的时候在证明题上花了太多时间。当然,这形状不是那么规则……
稍微推一下就可以发现规律。每次进一位时,进行的操作必然是先在开头位加1,然后把后面全置零。就像这样:
0 1 11 10 110 100 101 111 1111 1000 ....
所以我们要做两件事,其一是找到2^N位的bit码,其二就是递归求解在n-1层里k能得到的最大数。
if ( k == p )
return p + get ( n - 1, p - 1 );
else
return max ( p + getMax ( n - 1, k - p - 1 ), p + get ( n - 1, p - 1 ) );
1000P TheEncryptionDivOne
求两个字符集合的映射方案总数,其中大小写相同的字母不能映射。也就是a不能映射到A或是a。
这个题还是有一定难度的,比赛的时候只有10个人做出来。
由于字母和最后结果无关,我们可以统计每个字母在S1集合和在S2集合出现的次数。
比如{a,b,c} -> { b,c,d} 可以看做是 1个(1,0) a,2个(1,1) bc,1个(0,1) d。26个字母总共分成九种情况,这九个数字构成一个状态,具体的最大数量我也不知道:(,总之是可求的。
又因为求的是映射,只需要考虑下面集合和上面配对即可。也就是说,把a分别映射到bcd,得到F( {a,b,c} -> { b,c,d} ) =F({b,c}->{c,d})+F({b,c}->{b,d}) + F ( {b,c}->{b,c} )。
因为许多字母是同一个情况,因此可以对这九种情况逐一判断求解。
如例子中的状态[1-(1,0) 2-(1,1) 1-(0,1)]在集合1中取(1,0),也就是取a后,可以对2个(1,1)分别进行映射。得到的结果即为2*状态[1-(1,0) 1-(1,1) 1-(0,1)]。