省选模拟考试1
最近被splay,treap,dlx淹没。。
没写过考试的反思什么的感觉总结一下貌似很重要?
T1
详情见codevs2466
本来hash可过的题结果只给了64MB(oj上是256MB)
水题没什么好说的。。map判重都能过
收获:(学习了一发康托展开)
T2
codevs2467
貌似显然要先按b排序?
感觉搜索很兹瓷没想(xiangbudao)DP就没管了
正解是DP
f[i][j]代表前i个人,其中1窗口排到j分钟时需要的时间
两种转移方式 1.第i+1人在1窗口。此时最大值的可能有:当前i+1人吃完饭后没有人在吃饭:j+b[i] 或者是前i人有一人比i+1人还晚吃完f[i][j-a[i]]
2.在2窗口,同样两种转移方式:sum[i]-j+b[i] 或 f[i][j]
最后求f[n]一行中的最小值。
收获:贪心+DP结合
T3
codevs2468
矩阵乘法
考试之前中午和wyy还讨论了差不多的题所以知道大概是矩乘?
当然也是只会口胡
其中有很多细节也是在wyy的点拨下才想明白
首先很容易想到由于鳄鱼只有2,3,4三种周期
不如就把12作为一个大周期
这样处理起来会简单一点
O(kn^2)暴力大概是很容易想到的(我并没有想到)
然后我们先只跑12步好吧
然后我们发现好像12步之后就能12步12步走了
再深入想想就是矩乘了。。
剩下的小于12步多出来的直接暴力。
代码(建议先想清楚怎么构造矩阵)
1 void DP(int X)
2 {
3 if(!gg[0][X])f[0][X][X]=1;//f[i][j][k]代表i步,从j出发到k的路径条数
4 for(int i=1;i<=12;i++)
5 {
6 for(int j=1;j<=n;j++)
7 for(int k=1;k<=n;k++)
8 if(g[k][j])//k与j有双向边
9 {
10 f[i][X][j]+=f[i-1][X][k];
11 f[i][X][j]%=mod;
12 f[i][X][k]+=f[i-1][X][j];
13 f[i][X][k]%=mod;
14 }
15 for(int j=1;j<=n;j++)
16 if(gg[i][j])f[i][X][j]=0;//当j在i时刻有鳄鱼那么此时路径条数变0
17 }
18 for(int i=1;i<=n;i++)v[X][i]=f[12][X][i];
19 }
20
21 int main()
22 {
23 init();
24 for(int i=1;i<=n;i++)DP(i);//求每个点的f
25 qmod(k/12);//快速幂矩阵
26 int ans=0;
27 for(int i=1;i<=n;i++)
28 ans=(ans+f[k%12][i][end]*v1[str][i])%mod;//剩下的利用f数组完成
29 }
T4
准备弃坑。。