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,那么可以想到,只要满足每棵树和最近的树满足条件就可以保证和其他树满足了. ...
随机推荐
- touch事件学习
window.onload = function(){ var touch = { movetarget : false, touchStart : function (e) { console.lo ...
- C#中的Delegate
谈C#中的Delegate http://www.cnblogs.com/hyddd/archive/2009/07/26/1531538.html
- hdu 4155 The Game of 31 博弈论
给出序列,在剩下的卡中选择,谁先拿到大于31的输,搜一下就可以了! 代码如下: #include<cstdio> #include<cstring> ]; ],sum; boo ...
- Android 注入详解
Android下的注入的效果是类似于Windows下的dll注入,关于Windows下面的注入可以参考这篇文章Windows注入术.而Android一般处理器是arm架构,内核是基于linux,因此进 ...
- hdu 4159 Indomie (DP,数学概率)
推出数学公式: #include<stdio.h> #include<string.h> __int64 C(int m,int n) { __int64 tmp=; if(m ...
- 8 simple things that will make you sexy
8 simple things that will make you sexy8种方法教你不动声色的性感What makes a women sexy? Is it her body? Is it t ...
- 1.BOM学习
1.bom.html <html> <head> <title>bom演示</title> <script type="text/jav ...
- QT visual stuido 集成插件不能打开ui文件的解决方法(去掉xml的UTF8标记)
QT visual stuido 集成插件不能打开ui文件的解决方法 visual studio里不能打开这个ui文件,出现warning等解决方法是:于是将<?xml version=&quo ...
- 让浏览器屏蔽js
有时候为了测试js是否做到了渐进增强,需要屏蔽下js 做法: Internet选项>>安全>>自定义级别 禁用java小程序脚本和活动脚本 有的浏览器调试器直接就有这个功能
- ajax:serialize() 获取表单集合
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...