重邮第八届ACM大赛-预赛题解报告

A. a x b (Ⅰ)

签到题

  • 学会如何处理多组数据
  • 注意爆int

code

B. 多关键字排序

水题

  • 读入的时候可以考虑使用
scanf(" (%d,%d)", &x, &y);
  • 排序可以直接使用std::sort,当然也可以自己写,但冒泡排序等高复杂度算法无法通过该规模的数据;考虑使用快排、归并排序等高效算法
  • 可以自己写结构体,当然这里推荐使用std::pair;如果自己写结构体,需要写cmp函数或重载<运算符

更详细的STL用法可以自行搜索或参考Cplusplus
标程里使用的是读入挂…
code

C. 全排列

水题
使用std::next_permutation瞬秒 code
当然也可以自己递归生成,这里提供一个js觉得很劲的写法

D. 三数和为零

一个可行的做法是:

  • 枚举 ai
  • 查询set内是否有 ai
  • 将所有的 ai+aj(j<i) 插入set

这里使用std::set会超时,所以我手写了一个hashset code
当然这题做法还有很多,您们可以自己研究(比如使用two pointers,复杂度可以达到 O(n2) )这里贴一个js的code

背一下锅
这道题的数据水了,放了一些错误的做法过。
很多人是枚举两个数 ai+aj ,然后二分查找是否存在 aiaj ,但事实上题目要求这三个数的下标不同,这样做无法保证。比如:
对于 an={1,2,0} ,答案应该是No,但是很多人的程序会输出Yes,因为枚举-1+2时,在序列中查找1-2=-1,是找得到的,但是这个-1取了2次。
赛后数据已经更新了,这样水过的同学可以尝试改一下。

E. a x b (Ⅱ)

模拟高精度乘法
当然也可以用java的BigInteger水过
由于C++的高精度本弱写得太丑,就贴个java吧(逃
code

F. 数据结构

  • 对于操作1、2、3、4,我们可以使用std::deque双端队列来维护
  • 对于操作5,我们并不需要真的reverse整个序列,只需要用一个变量标记一下。若有标记,则操作1、2互换,3、4互换,标记与否不影响操作6
  • 对于操作6,用一个std::map维护即可

具体参见:
code

G. 矩阵链乘

动态规划经典例题,可参考算导等资料
f[i][j] 表示计算矩阵i到j需要的最少的乘法次数, row[i] 表示矩阵i的行数, col[i] 表示矩阵i的列数,则状态转移方程为:

f[i][j]=minik<j{f[i][k]+f[k+1][j]+row[i]col[k]col[j]}f[i][i]=0

时间复杂度 O(n3)
标程使用记忆化搜索实现
code

H. 满射函数

该问题的另一种等价叙述为:
n个不同的球放入m个不同的盒子中,要求每个盒子中至少有一个球,问有多少种不同的放法。

这和第二类斯特林数(集合的划分数)很像,事实上答案就是S(n,m)*m!,因为集合划分实际上是把m个盒子看成相同的,而m个盒子的全排列就是m!
但是本题n和m较大,如果用递推法求斯特林数会超时
这里需要使用容斥原理
f(k) 表示n个不同的球放入m个不同的盒子中,保证至少有k个盒子中不放球,的方案数
f(k)=Ckm(mk)n ,前者表示m个盒子中选k个出来(不放球),后者表示n个球放入剩下的m-k个盒子
利用容斥原理,可以得到:

answer=k=0m(1)kCkm(mk)n

大组合数的计算方法可以使用预处理阶乘,求逆元可以使用扩展欧几里得算法或者费马小定理+快速幂算法
当然这题由于组合数下标固定,上标递增,也可以不预处理阶乘,直接递推
code

I. a x b (Ⅲ)

FFT模板题…
直接模拟乘法复杂度 O(n2) ,会TLE
乘法运算可以看成卷积和运算,事实上卷积和的一种求法就是不进位乘法
使用fft做快速卷积即可,复杂度 O(nlogn)
这里建议手写complex,比STL自带的快不少
code

J. 行列式求值

模拟题
回忆线性代数,求行列式值的常用方法是将行列式化为上三角行列式,则行列式的值就是主对角线元素的乘积。在模p域下,加减乘都很好操作,而因为p是质数,所以模p域内任意非0元都存在乘法逆元,除法也可以转化为乘它的乘法逆元。
code

K. 炸弹爆破

模型可以转化为一个有向图
若炸弹A能引爆炸弹B(B的位置在A的爆炸范围内),则连一条A->B的有向边
枚举两个炸弹的组合,可以在 O(n2) 的时间内完成建图
建完图后,求强连通分量,缩点,找入度为0的点
入度为0则表示该联通分量不可能由其他联通分量(炸弹)引爆,只能付出代价手动引爆
而要引爆某个连通分量,显然引爆其中代价最小的炸弹最为划算
code

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页