07day1
怒跪了。
砍树
排序
【问题描述】
小 A 在一条水平的马路上种了 n 棵树,过了几年树都长得很高大了,每棵树都可以看作是一条长度为 a[i]的竖线段。由于有的树过于高大,挡住了其他的树,使得另一些树得不到阳光。如果有两棵树 i 和 j,i 顶端与 j 底端连线的倾角大于 45 度,我们就定义为 i 挡住了 j 。现在小 A 希望将一些树砍低,使得不存在挡住的情况。他想知道总共最少需要砍掉多少长度,请你来帮他计算一下。
注意,如果同一位置有两棵树的话,根据题意,我们只能将这两棵树都砍成高度为 0 才能保证它们不相互挡住,但是高度为 0 并不代表这棵树不存在。
【输入】
第一行一个正整数 n ,农示有 n 棵树。
接下来 n 行. 每行两个正整数 p[il, a[i] ,表示一棵树的位置和高度。
【输出】
输出一个数,表示最少砍断多少长度。
【输入样例】
3
0 2
1 2
3 3
【输出样例】
3
【数据规模】
对于 50%的数据,n≤100;
对于 100%的数据,n≤100,000,0<p[i],a[i]≤10,000。
【解题过程】
先按位置排一下序,处理一下同一位置上多棵树的情况,然后根据每棵树左右的树来决定要砍掉多少高度。倾角大于 45度其实就是树高不能超过相邻的树的距离,即
处理后的树高 h'(i) = min( h(i), p(i)-p(i-1), p(i+1)-p(i) )
然后被「但是高度为 0 并不代表这棵树不存在」坑了,这么不切合实际的限制居然也能出现在题目里只能说醉了。
第一次提交 0 分。
统计方案
中途相遇法
【问题描述】
小 B 写了一个程序,随机生成了 n 个正整数,分别是 a[i]..a[n],他取出了其中一些数,并把它们乘起来之后模 p,得到了余数 c。但是没过多久,小 B 就忘记他逃了哪些数,他想把所有可能的取数方案都找出来。你能帮他计算一下一共有多少种取数方案吗?请把最后的方案数模1000000007 后输出。
小 B 记得他至少取了一个数。
【输入】
第一行三个正整数 n、p、c,含义如题目所述。接下来一行有 n 个正整数,表示生成的 n 个随机
数。
【输出】
一个数。方案数模 1000000007。
【输入样例】
2 7 2
1 2
【输出样例】
2
【数据规模】
对 30%的数据有:n≤16,p≤10000;
对 100%的数据有:n≤32,p≤10^9,c≤10^9,a[i]<p,p 是质数。
【解题过程】
我的第一反应是动规,用 f(i, j) 表示在前 i 个数中取若干个相乘模 p 等于 j 的方案数,则
f(i, j) = f(i-1, j)+f(i-1, j/a(i) )
注意预先对 a(i) 模 p。对于 j 不能被 a(i) 整除的情况要做处理。但是对于 j < a(i) 的情况貌似处理不了?
反正不管怎么说,就算动规方程对了也做不了,时间复杂度明显太高。
然后就写了无脑 DFS 骗了 30 分。之后听到 LZW 大神说这是中途相遇法,简直 OTL。大意是这样的:
将给定的 n 个数平均分成两半,对于其中的一半做 DFS 找出其所有可能得到的模 p 的结果并保存在 hash 中,这样做的复杂度是 O(2^(n/2));然后对于另外一半同样做 DFS,对于得到的结果 b,计算出满足 a*b mod p = c 的 a 值,然后判断 hash 表中 a 这个值是否存在即可。这样做的复杂度同样是 O(2^(n/2)),完美解决。计算 a 的话可以用扩展欧几里得或者求逆元。
至于同余方程 a*b mod p = c 在模 p 范围内有且仅有一个解,简单证明如下:
假设存在另一个数 d*b mod p = c且 d>a(当然 d 也可以小于 a),则 d-a = kp,k 是整数。又因为 d 和 a 不可能大于等于 p,所以这个等式不可能成立。所以不存在这样的 d 值。
另外后来写快速幂求逆元的时候犯了傻X错误,把 %p 写成 %1000000007 了。(#@¥%#……%&……*¥%#)
另外居然还要注意 c >= p 的情况(在逗我?)以及 c=1 时将答案减一(不能一个都不取)。
魔棒
二分答案+动态规划
【问题描述】
有一个英雄,初始生命值是 hp(生命值无上限),在接下来的 n 秒内,每秒会受到一次伤害,第i 秒受到的伤害值为 a[i]。这个英雄 4 有一个道具"魔杖",魔杖的初始能量为 0,每受到一次伤害,积攒 1 点能量。在英雄受到伤害后,可以立即释放魔棒中的能量,恢复 15×[能量点数]的生命值,且魔棒的点数清零。释放能量有施法间隔 cd(cd 是正整数),即相邻的两次释放的时间间隔至少有 cd 秒。任何时刻当 hp≤0 时视为死亡,问这个英雄存活下来的前提下, cd 的值最大可以是多少?
注意,若 a[i]为负,受到"伤害"后实际上生命值是增加的,魔棒仍然积攒能量。
【输入】
第一行两个正整数 n,hp,含义如题目所述。
第二行 n 个整数,分别是 a[i]..a[n]。
【输出】
一个数,最大的 cd,cd 是正整数。
如果 cd 没有上限,输出"No upper bound.";如果无论如何都不能存活,输出-1。
【输入样例】
7 30
20 5 30 4 10 5 20 20
【输出样例】
2
【数据规模】
对于 30%的数据,有 n≤12;
对于 100%的数据,有 n≤500,|a[i]|≤1000。
【解题过程】
先把没有上限和无法存活的情况判断掉。
没有上限的情况即整个过程中一次都不用魔棒或者只用一次魔棒就能够活下来;无法存活的情况即每一秒都用魔棒都无法活下来。
然后是很明显的二分答案,CD 越短当然越容易存活,满足单调性。至于枚举出一个 CD 后如何判断是否能够存活,我的想法是贪心,每次 CD 一到就用掉,当然是错的,因为这样做可能会造成浪费(当前状态下根本不需要回血)而导致在后面的时间无法存活(CD 未到而快要挂掉)。后来换了一种贪心策略,每次快要死掉的时候才回血,但是这样可能会造成总的回血次数减少,并不一定合算。
所以还是动规吧。用 f(i, j) 表示前 i 秒中一共用了 j 次魔棒(且第 i 秒用了一次)之后的最大血量,则
f(i, j) = max{ f(k, j-1)-sum(k, i)+(i-k)*15, k<i }
但是这样做的复杂度是 O(N^3),再乘以 O(logN),无法承受。只能过 7 个点左右。
正解参见 http://www.cnblogs.com/vb4896/p/4003674.html
第一次提交 50 分。
(LZW 大神一直说要想想玩 Dota 的时候魔棒都是用来极限反杀的所以你这个贪心策略想想都是不对的云云。看来我这种不会玩 Dota 的人注定学不好 OI。)
07day1的更多相关文章
- 二模07day1解题报告
T1.种树(tree) 有n棵树,各有高度,要求每棵树的高度都小于它到其他树的距离(可能种一起).求砍掉的总高度是多少. Ok,那么可以想到,只要满足每棵树和最近的树满足条件就可以保证和其他树满足了. ...
随机推荐
- KMP高质量代码实现详解
KMP算法 对于KMP算法我分为两个部分说明,第一部分是算法部分,介绍KMP算法的算法思想:第二部分是实现部分,介绍一种厉害的实现代码以及代码注释.当然了由于本文主要介绍怎么实现故而先分析实现,对KM ...
- 错误 1 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口
http://www.cnblogs.com/waitingfor/archive/2011/12/19/2293469.html
- POJ 1027 The Same Game(模拟)
题目链接 题意 : 一个10×15的格子,有三种颜色的球,颜色相同且在同一片内的球叫做cluster(具体解释就是,两个球颜色相同且一个球可以通过上下左右到达另一个球,则这两个球属于同一个cluste ...
- HDFS Protocol修改流程
相对于1.x版本的Hadoop,2.x版本的Hadoop采用了Protocol Buffer作为序列化反序列化工具,以及RPC通讯工具.这样当我们对Hadoop源码进行修改之前,就需要了解Ha ...
- Github 学习
1.git$cd ~/hello-world.$git add . //这样可以自动判断新加了哪些文件,或者手动加入文件名字$git commit //提交到本地仓库,不加参数会提示,注意:^=Ctr ...
- iOS tintColor解析
在UIView中一个相对来说比较小的属性,tintColor属性是相当的强大.今天我们就来看看如何使用他,包含使用tint color进行着色标准控件.我们自定义控件甚至重新着色图像. 本章的实例程序 ...
- Linux系统中的load average
1. load average 定义 linux系统中的Load对当前CPU工作量的度量.简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟) 内平均 L ...
- 基于web工作流开发
目前在研发基于web工作流的开发 什么是工作流? 工作流简言之就是: 1.反应业务流程的计算机化的模型. 2.一类能够完全或者部分自动执行的经营过程:(为了提高效率,实现自动化). 3.任务.活动及活 ...
- Linux操作系统基础(四)保护模式内存管理(2)【转】
转自:http://blog.csdn.net/rosetta/article/details/8570681 Linux操作系统基础(四)保护模式内存管理(2) 转载请注明出处:http://blo ...
- Git - Tutorial官方【转】
转自:http://www.vogella.com/tutorials/Git/article.html#git_rename_branch Lars Vogel Version 5.8 Copyri ...