北京交通大学第七届新生程序设计竞赛题解

版权声明:本文为博主原创文章,转载请联系博主(通常都会同意就是了) https://blog.csdn.net/cccccwb/article/details/85349255

突然想起来还有这么个博客……决定以后每次打完比赛把会写的题写个题解在这里,也算是督促自己补题吧……

毕竟是新生赛,题目大部分还是比较水的……

A:

相当简单的计算,数据范围并不大,每次答案加上n/3,n(剩下的钱)变成n%3+n/3,直接循环到n<3即可。

B:

题目看上去很复杂,仔细读题发现, 所谓反向复读其实就是每一步走的路径要求是一个回文串,也就是中心对称。也即是说,对于一个点,只要指定了一个中心点,无论怎么走,这一步最终走到的都是关于这个中心点中心对称的对面那个点。而一条前半段路径成立的条件是,路径上的每一个点关于这个中心点对称的那个点都不是障碍物。因此,进行两次预处理,第一次预处理枚举一个中心点,求出其他点关于这个中心点对称的点是否是障碍。第二次预处理一样是枚举中心点,借助第一次预处理得到的结果进行DFS,能走到的点就说明从那个点可以以这个中心点为中心走出一步到对称点。两次预处理之后,我们得到了任意一个点以另一个点为对称中心能否走出一步。之后只要从起点BFS就可以了。

C:

比较暴力的模拟,数据范围不大,直接若干循环枚举每一天之后把数字拼起来暴力判断回文就可以了。

D:

乍一看像是数据结构加优化(事实上考场上除了HYX大佬以外其他人确实都是这么A的……),实际上如果采用并查集的路径压缩的思路,每次判断完之后将这个点直接连向下一个点,在查找时进行一下路径压缩,可以发现每个点最多被重复访问常数次,均摊效率是O(n)级别。考场上均摊效率算错了以为会T就没有敲QAQ

E:

数据范围只有1e5,暴力枚举每个数判断是否是素数的效率是根号的,也就是最多三百多点,而对其中的素数按位拆分后加起来最多也就是O(5),暴力的效率是1e7左右,完全可以通过。在这种题上用欧拉筛是不是有点浪费……

F:

一个相当显然的性质是,如果一个容量能够装下所有玩具,那比这个容量大的所有答案都可以装下,也就是说答案具有单调性,所以可以直接二分答案,则问题转化为给出K个固定容量的包,能否按照顺序装下所有玩具,这个直接模拟就可以了,总效率是O(nlogn)的。

G:

这题是F神出的,事实上题目是有问题的……没有保证p是素数或者p与10互质的情况下F神的标程是有问题的……不过假装看不见,先当作题目保证了(斜眼)。

以下推论全都是模p意义下的。

a[i]表示这个数字从第i位起的后半截是多大,则对于某一组能够成为答案的(l,r),有

\frac{(a[l]-a[r+1])}{10^{r+1}}=m

稍作变形即有

a[l]=a[r+1]+m*10^{r+1}

于是左边仅与l相关,右边仅与r相关……

b[i]=a[i]+m*10^{i}

则题意转变为求使a[l]=b[r+1]成立的方案数,只要从后往前统计,对于每一位,算出对应a[i]后答案加上已有的相等b的数量,之后算出这一位的b[i]并维护就可以了。

H:

如果直接买三只不比花y元买三只贵,那就直接算一只一只买要多少钱就好了,否则需要比较一下最后几只竹鼠是要分开买还是直接超额买一组三只划算。

I:

题目乍一看很长,好像是道难题,导致一堆人题看完就换别的题了,实际上相当水← ←。首先,最终答案的每个号粉丝数显然是已有的号里面粉丝最多的哪个(没必要自己找罪受多给他们搞粉丝对不),而僵尸号也要满足这个要求,也就是说,最终僵尸号必定是环形互相关注之后多余的可关注量才会用来填粉丝……所以如果k小于等于最大粉丝数,那就不可能完成要求,如果大于,假设最大粉丝数为m,那么每个僵尸号的贡献最多是k-m个关注(有m个要用来关注僵尸号),因此除一下就是答案了。需要注意的是,僵尸号的数量必须大于等于m+1才能实现环形关注(因为一个号关注另一个号只能关注一次,考场上被这一点坑了三个罚时QAQ),如果小于的话直接让答案等于m+1就好了。

猜你喜欢

转载自blog.csdn.net/cccccwb/article/details/85349255