未了(endless)(【CCF】NOI Online 能力测试2 入门组第一题 )
时间限制: 1.0 秒
空间限制: 256 MB
题目描述
由于触犯天神,Sisyphus 将要接受惩罚。
宙斯命 Sisyphus 推一块巨石上长度为 L的山坡。Sisyphus 匀速向上推的速度为每年 v 的长度(由于是匀速,故经过1/2年将能向上推 1/2的长度)。然而,宙斯并不希望 Sisyphus 太快到达山顶。宙斯可以施展 n 个魔法,若宙斯施展第 i个魔法(1≤i≤n),则当 Sisyphus 第一次到达位置 a i时,他将会同巨石一起滚落下山底,并从头推起。(滚落的时间忽略不计,即可看作第一次到达位置 ai后 Sisyphus 立即从山底重新出发)
例如宙斯施用了 ai =3 与 ai=5 的两个魔法。Sisyphus 的速度 v = 1,山坡的长度 L = 6,则他推石上山过程如下:
1.用 3 年走到位置 3。
2.受 ai=3 的魔法影响,回到了山底出发。
3.再用 3 年走到位置 3,然而因为是第二次到达,ai=3 的魔法不起作用。
4.用 2 年走到位置 5。
5.受 ai=5 的魔法影响,回到了山底出发。
6.用 66 年从山底走到了山顶。花费的总时间为 1414 年。
现在,宙斯有 q 个询问。对于第 i 个询问 ti,宙斯想知道,他最少需要施展多少个魔法才能使 Sisyphus 到达山顶所用的年数大于 ti 。
输入格式
第一行三个整数 n, L,v 分别表示魔法的种类数,山坡的长度,Sisyphus 的速度。
第二行 n 个整数。第 i 个整数 ai表示第 i 个魔法作用的位置。(1≤i≤n)
第三行一个整数 q 表示宙斯的询问个数。
接下来 q 行每行一个整数,第 i 行的整数 ti表示宙斯的第 ii 个询问。(1≤i≤q)
输出格式
输出 q 行,每行恰好一个整数,第 i 行的整数对应第 i 个询问的答案。(1≤i≤q)
如果宙斯无论如何都不能使 Sisyphus 使用的年数大于 ti,请输出 -1。
样例1输入
3 6 3
3 5 1
4
1
3
4
5
样例1输出
0
1
2
-1
正解一:
思路1:
1.首先可以发现的是高度越高耗费的时间越多,那么我们优先使用a[i]高的魔法可以耗费更多的时间。所以就先对ai 排序。
2.数组tm[0]代表不是魔法的时间,此后tm[i]代表施i次魔法的最大时间
3.再用与tm[i]比较询问ti比较
4.最后用普通的搜索会得80分,AC的话必须用二分搜索(传送门:二分搜索)
AC的C++代码如下
#include<iostream>
#include<algorithm>
using namespace std;
int n,l,v,q,a[200010],t[200010];
double tm[200010];
int main()
{cin>>n>>l>>v;for(int i=1;i<=n;i++)cin>>a[i]; sort(a+1,a+n+1);//从小到大排序 tm[0]=1.0*l/v;//不受阻碍爬到山顶时间 for(int i=1;i<=n;i++)tm[i]=1.0*a[n-i+1]/v+tm[i-1];//从最大开始加 cin>>q;//宙斯的询问个数 for(int i=0;i<q;i++)cin>>t[i]; for(int i=0;i<q;i++)//每一次询问 {int j;int num=upper_bound(tm,tm+n+1,t[i])-tm;//二分搜索if(num==n+1)//达不到目的cout<<-1<<endl;else cout<<num<<endl;}return 0;}
正解二:
#include<iostream>
#include<algorithm>
using namespace std;
long long n,l,v,q,t,a[200010],sum[200010];
int main()
{cin>>n>>l>>v;for(long long i=0;i<n;i++)cin>>a[i];sum[0]=l;sort(a,a+n);reverse(a,a+n);//使从大到小排列 for(long long i=0;i<n;i++)sum[i+1]=sum[i]+a[i];cin>>q;for(long long i=0;i<q;i++){cin>>t;//每一次询问 long long s=1ll*t*v;long long ans=upper_bound(sum,sum+n+1,s)-sum;//二分查找 if(ans==n+1)cout<<"-1"<<endl;else cout<<ans<<endl;} return 0;}
NOI Online能力测试视频版,让我们看看出题人们怎么说!
未了(endless)(【CCF】NOI Online 能力测试2 入门组第一题 )相关推荐
- 涂色游戏color(【CCF】NOI Online 能力测试2 提高组第一题 )
子序列问题sequence([CCF]NOI Online能力测试2 提高组第二题 ) 游戏match([CCF]NOI Online能力测试2 提高组第三题 ) 题目背景 1s 256M 题目描述 ...
- 子序列问题sequence(【CCF】NOI Online能力测试2 提高组第二题 )
本题代码稍后加入 题目背景 2s 512M 题目描述 给定一个长度为 n的正整数序列 A1, A2, ⋯, An .定义一个函数 f(l,r) 表示:序列中下标在 [l,r]范围内的子区间中,不同的整 ...
- 建设城市(city)(【CCF】NOI Online 能力测试2 入门组第三题 )
时间限制: 1.0 秒 空间限制: 256 MB 题目描述 球球是一位建筑师.一天,他收到市长的任务:建设城市.球球打算建造 2n 座高楼.为了保证城市美观,球球做出了如下计划: 球球喜欢整齐的事物. ...
- 观星(【CCF】NOI Online能力测试3 入门组)
题目描述 Jimmy 和 Symbol 约好一起看星星,浩瀚的星空可视为一个长为 N.宽为 M 的矩阵,矩阵中共有 N×M 个位置,一个位置可以用坐标 (i,j)(1≤i≤N,1≤j≤M)来表示.每个 ...
- 最急救助(【CCF】NOI Online能力测试3 入门组)
题目描述 救助中心每天都要收到很多求救信号.收到求救信号后,救助中心会分析求救信号,找出最紧急的求救者给予救助. 求救信号是一个由小写英文字母组成的字符串,字符串中连续三个字符依次组成sos的情况越多 ...
- 买表(【CCF】NOI Online能力测试3 入门组)
题目描述 Jimmy 到 Symbol 的手表店买手表,Jimmy 只带了 nn 种钱币,第 ii 种钱币的面额为 ki 元,张数为 ai 张.Symbol 的店里一共有 m 块手表,第 i 块手 ...
- 游戏match(【CCF】NOI Online能力测试2 提高组第三题 )
题目背景 1s 512M 题目描述 小 A 和小 B 正在玩一个游戏:有一棵包含 n=2m个点的有根树(点从1∼n 编号),它的根是 1 号点,初始时两人各拥有 m 个点.游戏的每个回合两人都需要选出 ...
- 文具订购(【CCF】NOI Online能力测试 入门组第一题)
[题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 3 元. 小明负责订购文具,设圆规,笔,笔记本的 ...
- 优秀子序列(【CCF】NOI Online能力测试3 提高组)
题目描述 现在请你求出 A 的所有优秀子序列的价值之和,答案对 10^9+7 取模. 输入格式 第一行一个正整数 n 表示序列长度. 第二行 n 个用空格分隔的非负整数,表示 a1,a2,⋯,an ...
最新文章
- python中pop函数_Python中的Pop函数
- java 1.7 liunx_在linux下安装Jdk1.7
- android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)
- 概率论与数理统计中的算子半群 第一讲 Banach-Steinhaus定理2 Banach-Steinhaus定理的应用
- 谷歌、雅虎支持中文域名搜索 有助提升SEO
- Python控制台英汉-汉英电子词典
- 动态规划——数塔问题
- rdkafka线程过多_Kafka/RocketMQ 多线程消费时如何保证消费顺序?
- 数学习题:求解不定方程a^2 + b^2 = 3025
- 智慧城市开放数据的发展趋势分析及探讨
- div+css 固定宽度且居中 文字左对齐
- 怎么安装python2.7_python2.7环境如何安装
- lua定时器与定时任务的接口设计
- 从零开始搭建EasyDarwin环境——Windows系统开发环境Golang的搭建
- python绘制散点图和折线图_Python散点图与折线图绘制过程解析
- 计算机445 135 139端口,关闭445 135 137 138 139端口方法图文教程
- 基于药效团模型和分子动力学模拟对PTP-LAR抑制剂的研究
- SQL Sever 2014 使用sql sever身份验证登录
- 删除docker registry镜像脚本报错No repositories directory found inside REGISTRY_DATA_DIR
- 工厂生产管理系统如何解决车间生产管理难题?