第一题:

题目大意:

给出数轴上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. 二模 (16) day1&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. Java源码初学_LinkedList

    一.LinkedList的内部数据结构 LinkedList底层是一个链表的数据结构,采用的是双向链表,基本的Node数据结构代码如下: private static class Node<E& ...

  2. Spring MVC 之拦截器(八)

     在springMVC中实现拦截器有两种方式 1.实现HandlerInterceptor接口 2.继承HandlerInterceptorAdaptor类 编写拦截器: package com.cy ...

  3. Hello,Akka

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.com/dreamhead-logs/235916459.html 只要稍微了解过一些Scala, ...

  4. IIS_各种问题

    IIS7中默认是已经加载了脚本映射处理.但今天装了个WIN7,装好IIS后却发现没有.于是手动去这安装,在添加html映射时提示:模块列表中必须要有IsapiModule或cgiModule 因为 I ...

  5. $.each 与$().each()

    在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法.两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. $().each,对于这个方法,在d ...

  6. 无法找到脚本*.VBS的脚本引擎解决办法

    当你在运行一些基于VBS脚本语言的文件时,系统可能报错.这时候可能是你的VBS脚本服务在注册表中出错了,原因可能是卸载或安装一些代码不规范的程序引起的.这里给出无法找到脚本引擎"vbscri ...

  7. 按键精灵 句柄 获得句柄 控制windows窗口 后台

    新建一个文本文档,打开,Windows就会给这个文本文档的窗口临时分配唯一的一串数字来标识这个窗体,以区别于其他窗口,这串数字就叫句柄.   因为句柄是临时随机分配的,所以每次虽然是打开同一个文件,但 ...

  8. 解析xml报classnotfound错误

    使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法,dom4j的快速手册里也建议使 用这种方式, 方法是使用Document的selectNodes(String XP ...

  9. 【bzoj3160】【xsy1726】万径人踪灭

    [bzoj3160]万径人踪灭 题意 给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数. \(n\leq 100000\) 分析 还是蛮不错的. 这道题基本上是自己想到的. 除了没有利用 ...

  10. MySQL DELETE 表别名问题