怒跪了。

 

砍树

排序

【问题描述】

小 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的更多相关文章

  1. 二模07day1解题报告

    T1.种树(tree) 有n棵树,各有高度,要求每棵树的高度都小于它到其他树的距离(可能种一起).求砍掉的总高度是多少. Ok,那么可以想到,只要满足每棵树和最近的树满足条件就可以保证和其他树满足了. ...

随机推荐

  1. java与.net之间xml传递,xml最前面多了个?

    最近做一个项目,是java提供webservice供.net调用.参数采用xml格式.首先碰到的问题: 1).net这边采用XmlSerializer 方式序列化对象传递给对方.对方在本机调试可以收到 ...

  2. SiteView

    http://www.siteview.com/cms/sites/public/home.html

  3. 微软VSS的超级BUG

    发现问题:今天一个新同事,无意中发现他直接就登录进VSS了,并且还是“admin”用户: 解决问题:于是开始在网上找度娘和谷歌帮忙,真是不查不要紧,一查吓一跳,VSS本身就存在这个bug,并且是一个超 ...

  4. 叠罗汉I

    叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上.同时我们应该让下面的人比上面的人更高一点.已知参加游戏的每个人的身高,请编写代码计算通过选择参与游戏的人,我们多能叠多少个人.注意这里的人都 ...

  5. RESTful登录设计(基于Spring及Redis的Token鉴权)

    转载自:http://www.scienjus.com/restful-token-authorization/ http://m.blog.csdn.net/article/details?id=4 ...

  6. Spring框架学习之第8节

    <bean id=”foo” class=”…Foo”> <property name=”属性”> <!—第一方法引用--> <ref bean=”bean对 ...

  7. Help Jimmy--poj1661(dp)

    题目链接:http://poj.org/problem?id=1661 下图是左边的,右边的同理: #include<stdio.h> #include<string.h> # ...

  8. iOS NSPredicate和正则表达式

    简述:Cocoa 提供了NSPredicate 用于指定过滤条件,谓词是指在计算机中表示计算真假值的函数,它使用起来有点儿像SQL 的查询条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的 ...

  9. Android百度地图开发03之地图控制 + 定位

    前两篇关于百度地图的blog写的是,一些基本图层的展示 和 覆盖物的添加+地理编码和反地理编码. 接下来,这篇blog主要说一些关于地图控制方面的内容和定位功能. 百度地图提供的关于地图的操作主要有: ...

  10. Index & Statistics ->> Rebuild Index会不会覆盖原先Index的WITH选项设置

    昨天因为工作中遇到要对某个数据库的表通通启用data_compression,突然有个念头,就是如果我当初用"ALTER INDEX XXX ON YYY REBUILD WITH (DAT ...