省选模拟考试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 }
View Code

 

 

 

T4

  准备弃坑。。

posted @ 2015-12-24 21:55  puck_just_me  阅读(207)  评论(0编辑  收藏  举报