您的位置:首页 > 其它

省选模拟考试1

2015-12-30 10:37 113 查看
最近被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
一行中的最小值。

  收获:贪心+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 }


View Code

T4

  准备弃坑。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: