
【NOIP2015模拟11.3晚】JZOJ7月29日提高组T1 爬山
发布日期:2021-05-06 15:39:48
浏览次数:14
分类:原创文章
本文共 1156 字,大约阅读时间需要 3 分钟。
【NOIP2015模拟11.3晚】JZOJ7月29日提高组T1 爬山
题目
题意
有一个点在第1分钟位于 a a a这个位置
从第2~ n n n分钟可以向上或向下走最多 d d d的高度
要求在第 n n n分钟结束后到达 b b b这个位置,求能到达的最高高度
分析
先考虑 O ( n ) O(n) O(n)
设当前高度为 x x x
很显然对于一个 i ( 2 ≤ i ≤ n ) i(2≤i≤n) i(2≤i≤n),如果是合法的,满足 x + d − d ∗ ( n − i ) ≤ b x+d-d*(n-i)≤b x+d−d∗(n−i)≤b
如果成立,答案和 x + d x+d x+d取 m a x max max
如果不成立,那么最高高度只能是 b + d ∗ ( n − i ) b+d*(n-i) b+d∗(n−i),和答案取 m a x max max
但是看到 n n n是小于等于1012的, O ( n ) O(n) O(n)是过不去的,考虑优化
我们可以二分求出最大的 i i i使得 a + d ∗ ( i − 1 ) − d ∗ ( n − i ) ≤ b a+d*(i-1)-d*(n-i)≤b a+d∗(i−1)−d∗(n−i)≤b成立,这样的话时间就是 O ( l o g ( n ) ) O(log(n)) O(log(n))
Code
#include<cstdio>#include<iostream>using namespace std;long long i,n,d,a,b,l,r,mid,ans;int main(){ freopen("mountain.in","r",stdin); freopen("mountain.out","w",stdout); scanf("%lld%lld%lld%lld",&n,&d,&a,&b); l=2; r=n; while (l<=r) { mid=(l+r)>>1; if (a+d*(mid-1)-d*(n-mid)<=b) { l=mid+1; ans=max(ans,a+d*(mid-1)); } else { r=mid-1; ans=max(ans,b+d*(n-mid)); } } printf("%lld\n",ans); fclose(stdin); fclose(stdout); return 0;}
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月12日 23时02分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
属性绑定v-bind指令
2019-03-04
python实现名片管理系统
2019-03-04
解决vscode安装Go扩展失败
2019-03-04
[汇编语言] 分支结构程序设计
2019-03-04
常用DOS命令
2019-03-04
Codeforces Round 89 (Rated for Div. 2)
2019-03-04
[牛客] n的约数 唯一分解定理+dfs
2019-03-04
最小生成树 (kruskal)
2019-03-04
数据结构与算法总结(3)
2019-03-04
Java基础语法
2019-03-04
404服务器错误的讲解
2019-03-04
原创-开发问题指南
2019-03-04
python学习--Django学习4、数据库的增删改查、django后台管理系统
2019-03-04
Django开发车辆违章系统、模糊查询、分页查询
2019-03-04
centos7.5 装Python3.7报错(解决办法)
2019-03-04
Java常用设计模式之单例模式
2019-03-04
线性扫描--求数组中三个数最大乘积
2019-03-04
爬虫之 xpath的节点关系
2019-03-04
爬虫之 lxml模块的安装与使用示例
2019-03-04
Python创建目录文件夹
2019-03-04