二模 (7) day1

时间:2021-04-23 10:08:10

第一题:

题目大意:

给出数轴上N棵树的坐标和高度,如果两棵树之间的距离小于其中一颗树的高度,那么就有树会被挡住。因此要把一些树砍矮一点。求砍树的总高度最小值。

N<=100000;

解题过程:

1.水题,直接按坐标升序排个序,然后看某棵树左右的树会不会被挡住,砍掉相应的高度即可。。 特殊考虑最左边的树和最右边的树。

初始得分100.


第二题:

求从给定的n个数中取一些数(必须取),使得他们的乘积 mod p = c 的方案数。n≤32,p≤10^9,c≤10^9,a[i]<p,p 是质数

解题过程:

1.看到n<=32第一直觉就是 刘汝佳训练指南上提到的 “中途相遇法”, 前dfs 出 前n/2个数的乘积的方案数,用hash 挂链来存。。然后dfs后n/2个数,如果乘积mod p为a, 那么 只要 在前n/2个数中  找到  乘积mod p=x ,a*x mod p = c 的 x的方案数即可。  求解x就是解一个同余方程,可以用拓展欧几里得来实现。。结果考试的时候脑子短路了,怎么都写不出来。。。 (要抽点时间好好整一整它了) 初始得分10分。。

2.其实还有更加简单的方法求x,也是考试之后才想到的。。   根据 p是质数 ,那么 ap-1  ≡ 1 (mod p) 。 同余式两边同时乘c,ap-1 * c  ≡ c (mod p)

那么x 就是 ap-2  * c   。 可以证明在p的范围内 x 有唯一解。。 如果 a=0 c!=0当然就无解喽,如果 a=0,c=0 ,那么 前n/2个数不管怎么取都可以,所以方案数就是2n/2  。。其实这是我写题解才发现的 "边界"。。不过不会出现这种情况,题目里有说a[i]<p,所以a[i]不管怎么乘都不会mod p=0,除非a[i]=0。。如果a[i]=0,那么只能说出题人心够狠。。


第三题:

题目描述:有一个英雄,初始生命值是 hp(生命值无上限),在接下来的 n 秒内,每秒会受到一次伤害,第i 秒受到的伤害值为 a[i]。这个英雄 4 有一个道具“魔杖”,魔杖的初始能量为 0,每受到一次伤害,积攒 1 点能量。在英雄受到伤害后,可以立即释放魔棒中的能量,恢复 15×[能量点数]的生命值,且魔棒的点数清零。释放能量有施法间隔 cd(cd 是正整数),即相邻的两次释放的时间间隔至少有 cd 秒。
任何时刻当 hp≤0 时视为死亡,问这个英雄存活下来的前提下, cd 的值最大可以是多少?

如果 cd 没有上限,输出“No upper bound.”;如果无论如何都不能存活,输出-1。  n≤500,|a[i]|≤1000。

解题过程:

1.第二题扩展欧几里得写不来。就跑来搞这题,结果只会用贪心处理 2种无解的情况:

首先要充分理解cd的含义。。如果cd=1,假设第1s末用了魔棒,第2s末就可以再次使用。

对于No upper bound的情况(cd无穷大,那么只有一次用魔棒的机会):只要让英雄不断挨打,如果不加血就要死,那么就让他加血,如果最后还没死,就是No upper bound。如果加血还是要死,那就真的死了。

对于无论如何都不能存活,输出-1的情况:假设cd=1,那么只要每次挨打过后都用魔棒加一次血。如果还是死,那就必死了。

2.对于有解的情况,看看数据范围就知道肯定不是贪心啦。。 至少我只能想到cd一好就用魔棒的贪心策略,但是有谁打dota魔棒cd一好就吃的。。。当然是要留着拿来耍操作 玩极限的喽 ><。 于是就打算二分CD,然后判断能否活下来。

一开始想到用三维的状态来表示,前i分钟,剩余j点能量,还要k分钟才能再次使用魔棒。。。  但是复杂度太高。。  考虑到除了第一次吃魔棒,其他时候吃都必须满足剩余能量大于等于CD。

那么就用F[i][j][0] 表示 到第i分钟末(注意是末)为止,剩余能量为j,且第一次免费用的魔棒还没用,最多还能剩多少血。

对应的F[i][j][1]表示第一次免费魔棒已经用过了。

转移也比较奇葩。

当j>=2的时候 , F[i][j][0]=F[i-1][j-1][0]-cost[i] ;    F[i][j][1]=F[i-1][j-1][1]-cost[i];

当j=0的时候,那么第i分钟末肯定吃了一次魔棒;( 因此不存在状态F[i][0][0])

所以 F[i][0][1]=MAX { max{F[i-1][k][0]+15*k } , max{F[i-1][k][1] + 15*k} - cost[i] + 15;  +15是因为第i分钟也加了1点能量且在这分钟末被用掉了。 对于第一个max,k无要求,对于第2个条件,k必须大于等于CD,因为前面已经把免费用的魔棒用过了。

那么 就可以用一个g[i-1][0]  g[i-1][1]  分别来表示2个max的值了。

同理 F[i][1][1]=MAX { max{F[i-1][k][0]+15*k } , max{F[i-1][k][1] + 15*k} - cost[i]  第i分钟的能量没有用掉,所以不用+15;

或者F[i][1][1]可以直接等于F[i-1][0][1]-cost[i] (也是写题解的时候想到的。应该是对的,明天实验下);

另外f[i][1][0]=f[i-1][0][0]-cost[i]。

所以感觉 不用分j>=2来讨论,直接j>=1的全部归为一种即可。

表达能力有限,贴个代码(只贴判断能否活下来的函数吧),写得很挫。(貌似标准算法是差分约束系统?不过本弱渣不会额。。)

 bool check(int mid)
{
memset(f,,sizeof(f));
memset(g,,sizeof(g)); f[][][]=hp;
g[][]=hp; for (int i=;i<=n;i++)
{
for (int j=;j<=i;j++)
{
f[i][j][]=f[i-][j-][]-a[i];
f[i][j][]=f[i-][j-][]-a[i];
if (f[i][j][]>)
g[i][]=max(g[i][],f[i][j][]+j*);
if (f[i][j][]> && j>=mid)
g[i][]=max(g[i][],f[i][j][]+j*);
}
f[i][][]=f[i-][][]-a[i];
if (f[i][][]>)
g[i][]=max(g[i][],f[i][][]+); if (max(g[i-][],g[i-][])>a[i] && max(g[i-][],g[i-][])>)
f[i][][]=max(g[i-][],g[i-][])+-a[i];
if (max(g[i-][],g[i-][])>)
f[i][][]=max(g[i-][],g[i-][])-a[i];
}
for (int i=;i<=n;i++)
if (f[n][i][]> || f[n][i][]>)
return true;
return false;
}

一开始把CD理解错了,结果答案全部相差1了。。只对了无解的2个点。。20分。 感觉自己还是太弱了。。最后把ans-1去掉就操过去了说。。

二模 (7) day1的更多相关文章

  1. 二模 &lpar;16&rpar; day1&amp&semi;day2

    第一题:题目大意: 数列a[0]=a[1]=1, a[n]=a[n-2]*a[n-1]*n,求a[n]的因子个数 mod 1000000007.  n<=1000000 解题过程: 1.递推式还 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. 二模 (8) day2

    第一题: 题目描述: 有 n 个炸弹,有些炸弹牵了一根单向引线(也就是说引线只有在这一端能被炸弹点燃),只要引爆了这个炸弹,用引线连接的下一个炸弹也会爆炸.每个炸弹还有个得分,当这个炸弹被引爆后就能得 ...

  4. 二模 (12) day1

    第一题: 题目大意: 求由N个1,M个0组成的排列的个数,要求在排列的任意一个前缀中,1的个数不少于0的个数.N,M<=5000. 解题过程: 1.看到N,M的范围就明确肯定不会是dp,因为起码 ...

  5. 二模 (3) day1

    第一题: 题目描述: 一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.给定 A,B 和 n 的值,要求计算 ...

  6. 二模 (15)day1

    第一题: 题目大意: 有两个长度为N的序列A和B,在A和B中各任取一个数相加可以得到N2个和,求这N2个和中最小的N个. 解题过程: 1.这题是刘汝佳<<训练指南>>上的一道经 ...

  7. 二模 (13)day1

    第一题: 题目大意: N个发射站排成一排,求每个发射站左右第一个比它高的发射站. N<=1000000 解题过程: 1.前几天做poj的时候刚好在discuss里看到有一个神奇的东东叫单调栈,正 ...

  8. 二模 (11) day1

    第一题: 题目大意:用邻接矩阵给出一棵树(边权非负)上N个节点相互之间的最短路距离,求这棵树所有边权的和. 解题过程: 1.暂时还没想出来,待AC. 第二题: 题目大意:给出一些单词,然后建立Trie ...

  9. 二模 (9)day1

    第一题: 题目大意: 给出一个n位01串,要么不动它,要么把它删掉一个字符,要么插入一个字符(0或1),要么把一个1变成0,.使得有1的位置号的总和是n+1的倍数,或者是0. 解题过程: 1.直接枚举 ...

  10. 二模 (10)day1

    第一题: 题目描述: 一个阅览室每天都要接待大批读者.阅览室开门时间是0,关门时间是T.每位读者的到达时间都不一样,并且想要阅读的刊物不超过5本.每位读者心里对自己想看的刊物都有一个排位,到达之后他会 ...

随机推荐

  1. 使用 TRegistry 类&lbrack;1&rsqb;&colon; 显示各主键下的项

    使用 TRegistry 类[1]: 显示各主键下的项 {XP 注册表中的主键} HKEY_CLASSES_ROOT    {文件类型信息} HKEY_CURRENT_USER    {当前用户信息} ...

  2. Dev 统计GridControl界面上当前选中的一行的值

    private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChang ...

  3. foreach -begin -process -end

    gc d:\vm.txt|foreach  -begin {write-host "It's beginning."}  -process {$_ +"aa"} ...

  4. jquery实现横向导航

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Partitions - Partition Storage Modes and Processing-MOLAP、ROLAP、HOLAP

    https://docs.microsoft.com/en-us/sql/analysis-services/multidimensional-models-olap-logical-cube-obj ...

  6. &lbrack;零&rsqb; Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用

    Java Virtual Machine  官方介绍 Java虚拟机规范官方文档 https://docs.oracle.com/javase/specs/index.html 其中以java8的为 ...

  7. 浏览器各个版本和系统(chrome&sol;safari&sol;edge&sol;qq&sol;360)

    浏览器对象: let userAgent = navigator.userAgent.toLowerCase()console.log(userAgent) Edge: mozilla/5.0 (wi ...

  8. 第19月第20天 UITableView:改变 TableHeaderView 的高度 获取目录大小

    1.UITableView:改变 TableHeaderView 的高度 CGRect newFrame = headerView.frame; newFrame.size.height = newF ...

  9. &period;NetCore发布到Centos docker

    将.netcore mvc项目发布到centos7的docker中.环境 vmware14+Centos7+docker-ce 1.使用vs将.netcoremvc项目发布到本地,修改发布后的目录 名 ...

  10. sqlserver2017 &plus;SSMS&plus; VS2017&plus;SSDT 安装要点及相关组件下载地址

    1.sqlserver2017安装PolyBase需要安装jdk7 ,注意必须是7  jdk10是不行的. 下载地址:http://dl-t1.wmzhe.com/30/30117/jdk_7u_1. ...