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,那么可以想到,只要满足每棵树和最近的树满足条件就可以保证和其他树满足了. ...
随机推荐
- DevExpress licenses.licx 问题
在DevExpress ( 当然并不范指DevExpress,很多收费软件都是这样的)中,licenses.licx 是用户许可证书文件,当我们使用某些ActiveX(是Microsoft对于一系列策 ...
- Vi的使用
Vi的使用: 范例一: 使用Vi进入一般模式: [root@dsetl lp]# vi test1.txt 范例二:按下i键进入编辑模式,开始编辑文字 -- INSERT – 范例三:按下[ESC]键 ...
- POJ 1113 Wall(Graham求凸包周长)
题目链接 题意 : 求凸包周长+一个完整的圆周长. 因为走一圈,经过拐点时,所形成的扇形的内角和是360度,故一个完整的圆. 思路 : 求出凸包来,然后加上圆的周长 #include <stdi ...
- (4)用opengl读入off文件生成可执行文件把模型显示出来(未完待续)
·找了好几个程序,好像都达不到我的要求,去教程里看看吧! 在往上抛出了这问题,好几天才有人回答,我已经找到程序了 正好的他的分析对我分解程序很有用 这是一个难度比较高的 首先你要分析.off文件结构, ...
- JS之DOM(二)
一.DOM节点的操作 1.增加: (1). document.creatElement('标签名');创建元素节点 (2). document.creatTextNode('文本内容'):创建文本节点 ...
- appserv安装
Appserv 官网: http://www.appservnetwork.com/ 安装好后,输入http://localhost:8082/验证是否装成功,成功后如下图
- 华为OJ:字符串合并处理
字符串合并处理 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在 ...
- CentOS系统常用命令
1.进入目录命令 cd /usr/bin //进入etc目录 cd .. //切换到上一层目录 cd / //进入主目录 2.新建文件命令 比如进入某个目录后执行 vim test 2.查看运行的项目 ...
- ios--集成支付宝钱包支付iOS SDK的方法与经验
文/胖花花(简书作者)原文链接:http://www.jianshu.com/p/fe56e122663e著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 没想到,支付宝的SDK是我目前 ...
- Android笔记——导入Github开源项目CircleRefreshLayout
百度n久都找不到android studio导入第三方类库的正确方法,纠结睡不着 ,最后终于蒙到了方法,原来想太多了 ---------------------------------------- ...