一模 (6) day2

第一题:

题目大意:求最长公共上升子序列(LICS);

解题过程:

1.一开始想到模仿求最长公共子序列的方法,F[i][j]表示A串前i个,B串前j个的最长公共子序列,很明显当A[i]!= B[j]时,F[i][j]=max (F[i-1][j] , F[i][j-1]);

当A[i] = B[j] 的时候,由于还要满足上升的条件,那么就保存一个S[i][j]表示F[i][j]对应的最长公共上升子序列的末尾的最小值。那么F[i][j]=F[i-1][j-1]+1 (S[i-1][j-1]<A[i]);

再和max (F[i-1][j] , F[i][j-1])比较一下就好,转移的时候带上S[i][j]。。但是考虑到如果S[i-1][j-1]>A[i],我们虽然不能把A[i]连上去,但是可以用A[i]去替代F[i-1][j-1]对应的最长公共上升子序列中的字母。。  然后我就傻逼的直接s[i-1][j-1]=A[i] 了。WA 6 个点。

2.正解:F[i][j]表示A串前i个,B串前j个且以B[j]结尾的最长公共子序列。。很明显:

当A[i]!= B[j]时,F[i][j]=F[i-1][j];

当A[i] = B[j]时,需要往前找到一个F[i-1][k],满足B[k]<B[j], 加1之后可以转移到F[i][j]; 所以 F[i][j]=max (F[i-1][k]+1)  (1<=k<j &&  B[k]<B[j]);

这样的复杂度是(NM^2)的,需要优化:

在计算F[i][j]的时候,维护一个max, 表示max(F[i-1][k]) (1<=k<=j  && B[j]<A[i]), 那么在计算到F[i][j‘] (j‘>j) 并且 A[i] = B[j‘]时,max的值就是max(F[i-1][k]);

具体实现看代码:

 1 void LICS()
 2 {
 3     for (int i=1;i<=n;i++)
 4     {
 5         int ma=0;
 6         for (int j=1;j<=n;j++)
 7         {
 8             if (a[i]==b[j])
 9                 f[i][j]=ma+1;
10             else f[i][j]=f[i-1][j];
11             if (b[j]<a[i] && f[i-1][j]>ma)
12                 ma=f[i-1][j];
13             ans=max(ans,f[i][j]);
14         }
15     }
16     printf("%d\n",ans);
17 }

空间复杂度还可以优化到一维:

 1 void LICS()
 2 {
 3     for (int i=1;i<=n;i++)
 4     {
 5         int ma=0,tmp;
 6         for (int j=1;j<=n;j++)
 7         {
 8             tmp=ma;
 9             if (b[j]<a[i] && f[j]>ma)
10                 ma=f[j];
11             if (a[i]==b[j])
12                 f[j]=tmp+1;
13             ans=max(ans,f[j]);
14         }
15     }
16     printf("%d\n",ans);
17 }

第二题:

题目描述:

在一个坐标轴上,有 M 辆坦克,第 i 辆坦克在时刻 0 处于 pos[i](pos[i]>0),移动速度为speed[i]个单位,即在时刻 k 就处于 pos[i]+speed[i]*k。原点上有一炮台。炮台有 N 颗炮弹,在时刻 0 开始就可以发射炮弹,而且发射的顺序是你来确定的,每次只能发射一颗,一颗炮弹只能用一次。每个炮弹都有一个休息时间 rest[i],如果在某次发射了第 i 颗炮弹,要间隔 rest[i]后才能再发射。一颗炮弹只能消灭范围 D(0 到 D)内的一辆坦克。
最多能消灭多少辆坦克?

解题过程:

1.这题很快能想到贪心策略:首先rest小的炮弹肯定先打,其次跑的快的(超出范围D的时间短)坦克先打。。

2.如果担心double 精度问题,比较的时候可以把除法转换成乘法。

犯的错误:循环每个炮弹打哪个坦克的时候,碰到一个坦克不能打,我就直接break了。。其实应该往后找到第一个能打的坦克。

第三题:

题目大意:

有两种操作,操作一:把数x变成它的约数和(约数不包括它本身,且约数和比它小)。操作二:把x变成一个比它大的数y(y的约数和是x);

给出一个N,N<=50000,限定所有的数字变换在不超过 N 的正整数范围内进行,求不断进行数字变换且没有重复数字出现的最多变换;

解题过程:

1.首先很快想到模仿筛法预处理出每个数的约数和,然后转化成图论模型(能变换的两个数连一条边),感觉会有很多限制,比如会有环,不是所有点都相互连通等情况。然后就只好直接爆搜。。貌似竟然能过7个点,因为DFS树的深度很小。

2.看了题解后说是树的最长链。。。冷静分析,发现是不可能出现环的,既然x能变成y,那么y也能变成x,那么假设x>y的时候才连一条从x到y的有向边。表示x比y大,且x能变成y,如果有环,那么从x出发又回到x,就变成x比它自己小,所以不可能。。 整个图确实是好几个连通分量,所以正解应该是在每个连通分量里求最长链。但是事实上只要在1所在的连通分量里求就能AC。。数据弱了吧。

时间: 2024-12-09 22:32:49

一模 (6) day2的相关文章

二模 (8) day2

第一题: 题目描述: 有 n 个炸弹,有些炸弹牵了一根单向引线(也就是说引线只有在这一端能被炸弹点燃),只要引爆了这个炸弹,用引线连接的下一个炸弹也会爆炸.每个炸弹还有个得分,当这个炸弹被引爆后就能得到相应得分.现在要你引爆 k 个炸弹,使得得分最大. 解题过程: 1.一开始想到算出每个入度为0的点打掉之后的得分,然后做个堆,从大到小打,但是路径会有重叠的情况,也就是说打掉一条路径后可能会导致另外一条路径的权值发生变化.. 2.然后听到YYL大神一直在说2次BFS,就想到可以倒着来做..从出度为

一模 (2)day2

第一题: 题目大意:给出n种物品和每种物品的件数,求拿k件的方案数.N<=30 解题过程: 1.一开始总想着是组合数学的模型,结果怎么都想不出来..然后写了个爆搜,数据很弱,只有1个点超时. 2.AC算法:F[i][j] 表示前k种取j件的方案数,枚举第i种物品分别取了0,1,2....p[i]件,累加方案数,即F[i][j]=sum(F[i-1][j-k])   0<=k<=min(j,p[i]); 思考:如果数据范围改的大一点,比如 K,N<=2000呢 ,求方案数mod p,

一模 (4) day2

第一题: 题目大意:二进制数 n mod m 的结果是多少?  n 的长度(二进制数的位数)<=200 000:  m 的长度(二进制数的位数)<=20. 解题过程: 1.我的算法是直接高精度模拟,但是数据坑爹地有前导0,有前导0的4个点都WA了.. 高精度除法的编程复杂度确实有点. 2.标程算法要简单的多,考虑m的长度并不大,直接计算出来,然后对n取模,因为n可以拆成 2^x1 + 2 ^x2 ..... 2^xk,从左往右扫描,每次 乘2 在加上当前位的数,对m取模..利用同余定理,比较取

二模 (6) day2

第一题: 题目大意:50*50的格子里玩贪吃蛇.给出N步扭头的操作,判断贪吃蛇会在第几步挂掉.(蛇初始向东) 解题过程: 1.一开始的方法是:为了加快速度,只保存头和尾的坐标,然后保存尾巴的方向,每次move先头运动,然后尾巴按照之前的方向运动直到需要改变方向(继续按之前的方向运动将撞到墙壁或者走到一个map[x][y]==0的地方)..事实证明这样是错误的.有可能尾巴继续走会到一个map[x][y]==0的地方,但是还不需要改变方向.. 运气不错,竟然还拿到了60分. 2.AC算法:保存所有点

二模 (2) day2

第一题: 题目描述: 在一个长方形框子里,最多有 N(0≤N≤6)个相异的点.在其中任何-个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴.那么应该按照怎样的顺序在这 N 个点上放置油滴,才能使放置完毕后所有油滴占据的总面积最大呢?(不同的油滴不会相互融合)注:圆的面积公式 V=pi*r*r,其中 r 为圆的半径 解题过程: 1.考虑到最多只有6个点,那么直接dfs实现枚举即可. 2.注意题目要求的是剩余面积...还有如果

一模 (3) day2

第一题: 题目大意:和day1一样,给出m个小于n的数,求出出现次数大于m div 2 的数. 数据范围加大,1<=n<=2^31   1<=m<=3000000 解题过程: 1.一开始写了个数组模拟链表 hash,按 mod 指数p 分类,用一个数组记录 每一类的个数,如果每一类个数全部都小于等于一半,那么无解,如果有一个大于一半,那么遍历一边这一类的所有的元素,用一个表保存下来,看每个数出现了多少次. 超时一个点. 2.输入用getchar 优化后,最大数据0.4s过. 3.还

又是一个二模02,不过day2

话说比较简单.除了第三题不会写平衡树啊你妹!!边做边写吧. 机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~ 仍然是机智的链接链接:http://pan.baidu.com/s/1bn6I14N 密码:pmsa 第一题: 题目的数据范围非常小,来个 大法狮 吧.$6^6$只有$46656$,加上浮点运算的超

二模 (13)day2

第一题: 题目大意: 给出一个N*M的矩阵,定义一条路径的权值为经过的所有点权值的最大值.求一条从第一行到第N行的路径,使得路径权值最小. N,M<=1000 矩阵内点的权值小于1000. 解题过程: 1.感觉有点像vijos的晴天小猪,有后向性的dp,当时用了spfa来做,于是这题也用spfa了.听说网格图可以卡掉spfa,以前一直不相信,结果今天就被网格图卡死了. TLE 5个点. 50分 2.AC算法:考虑点的权值小于1000,可以直接二分答案&&flood—fill 即可.

二模 (3) day2

第一题: 题目大意:(难以概括,就不贴了把.) 解题过程: 1.担心被精度问题恶心,就把平均数的地方乘了N,这样只有最后计算的时候才会是小数.. 2.数组保存的时候蛋疼的 没改成double.结果全部WA了. 初始得分0分. 第二题: 题目大意: 给出N件衣服的湿度,然后单位时间里衣服的湿度自然会减少A,单位时间里还可以用烘干机使一件衣服的湿度减少B(烘干的同时会自然减少A).求最少的时间衣服全部干. 解题过程: 1.很明显是考堆的,一个贪心思想就是每次都取出湿度最大的衣服 用一次 烘干机. 2