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,那么可以想到,只要满足每棵树和最近的树满足条件就可以保证和其他树满足了. ...
随机推荐
- CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码
CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码 CSS Animatie 彩蛋爆料直击现场 CSS Animatie是一款在线制作CSS3动画的工 ...
- Javascript 偏移量总结
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- spring_150803_component
实体类: package com.spring.model; public class DogPet { private int id; private String name; private in ...
- 常用搜索引擎的算分,你get了嘛?
搜索引擎发展至今,已公布了多种算法.作为SEOER的你,还不懂,就out啦.懂了不会用,也是然并卵的一种行为.了解算法知识并不懂得如何把算法实践于SEO工作的你,还是处于学生思维,是时候该升级了.且听 ...
- [转载]U3d常规性能优化技巧
以下技巧并不是必须的,但是对于想要提升游戏性能的人来说应该还是很不错的. 优化的常规技巧 n 剖析你的游戏. 不要花费时间来优化那些晦涩的代码或者缩减图形文件的大小,除非这是你游戏的瓶颈.第一次剖析你 ...
- [iOS]ARC和MRC下混编
1.在MRC工程中使用ARC的文件(例如AFNetworking,SDWebImage,MJRefresh等)在Build Phases里找到对应.m 在后面添加-fobjc-arc(代表这个文件使用 ...
- http://my.oschina.net/pangyangyang/blog/144495
http://my.oschina.net/pangyangyang/blog/144495
- 解决yum错误Error: requested datatype primary not available
服务器信息: [mvj3@sdk2 ~]$ cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@ca-build10.us.oracle ...
- Java:多态性
Java的多态性:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用. java的多态性要满足三个条件: 1.继承关系 2.在子类重写父类的 ...