8:00——8:40 想,做T1
8:40——10:30 想,做T2
10:30——12:00 打T3部分分,想T4
得分情况
| 题目 |
T1 |
T2 |
T3 |
T4 |
| 分数/状态 |
100/AC |
85/RE |
WA/RE/0Pts |
0// |
错误原因
T2
数组开小了,导致Runtime Error
这件事告诉我们数组一定要开大,但是开大了又可能会MLE,最后建议使用vector
T3
注意到20分的时候,wi=0,遂使用Dijkstra模板,但是因为数组又没开大导致小样例WA,大样例RE
这个数组怎么这么坏啊
题解
T1 小信学习欧几里得算法
题意
输入n,计算所有数对(a,b)(1≤a<b≤n)中,使得lcm(a,b)÷gcd(a,b) 为质数的数对个数
思路
设a=gx,b=gy,gcd(x,y)=1,则
gcd(a,b)lcm(a,b)=xy
要求xy为质数,唯一确定的构造方法便是x=1,y=p(p为质数),计算方式为
p≤n∑⌊pn⌋
T2 涛涛的地铁
题意
给出n个地铁站,m条线路,p家公司,每条线路隶属于一个公司w,票价为c
给出q个询问:从u站到v站,最多乘坐k家公司的地铁,求最小花费,若无法到达输出-1
数据限制:n≤100,p≤6,q≤106,c≤104,m≤p×n×(n−1)
好家伙这么贵的票价这么多的地铁公司这么多线路,涛涛同学是不是生活在Toˉkyo
思路
注意到p≤6,可以直接状压枚举每个公司
然后使用Floyd求每对点之间最短距离即可,最后前缀最小化求出答案,时间复杂度Θ(2p×n3),可以Accepted
数组一定要开大啊喂
T3 最短路
题意
从城镇1出发,到城镇n,走最短的路径,路径上有市场,可以做一次买卖(先买后卖或者先卖后买)
求最短路
在最短路的前提下,求最大利润
思路
先使用BFS,找到最短路
在所有的最短路径上,找出收益最大的方案
- 构建DAG
- 建立前缀最大差,后缀最大差
- 枚举,寻找最优解
T4 时光里的卡牌
题意
共有2n张牌,初始上面n张牌是解锁的
每轮操作
- 从已解锁的牌中等概率选一张,加入手牌
- 得分+=当前手牌所有牌的和
- 如果还有未解锁的牌,解锁最上面的一张
思路
我们首先思考单张牌的贡献
假设第i张牌在第k回合被抽走
- 当前回合贡献一次,因为在手牌中
- 之后每轮都会贡献一次
所以这张牌的贡献是
(2n−k+1)×ai
我们再来思考抽中概率
bj=min(n,2n−j+1)
表示第j轮开始时已解锁的牌数量
期望贡献
情况1:i≤n(初始已经解锁)
概率公式
Pr[k]=bk1k−1∏j=1bjbj−1
期望贡献
E[i]=aik=1∑2n(2n−k+1)×bk1k−1∏j=1bjbj−1
情况2:i>n(后来解锁)
E[i]=aik=i−n+1∑2n(2n−k+1)×bk1k−1∏j=i−n+1bjbj−1
化简
注意到∏部分与前缀积相似
定义
P[k]=j=1∏kbjbj−1,p[0]=1
所以说
-
对于初始牌
E[i]=aik=1∑2n(2n−k+1)×bkP[k−1]
-
对于后来的牌
E[i]=aik=i−n+1∑2n(2n−k+1)×p[i−n]×bkP[k−1]
代码实现
-
预处理b数组
-
预处理p数组
-
预处理w数组
-
预处理前缀和prew数组
-
计算期望