【NOI Online #2 入门组】 未了

21 篇文章 0 订阅
17 篇文章 0 订阅

[NOI Online #2 入门组] 未了

题目描述

由于触犯天神,Sisyphus 将要接受惩罚。

宙斯命 Sisyphus 推一块巨石上长度为 L L L 的山坡。Sisyphus 匀速向上推的速度为每年 v v v 的长度(由于是匀速,故经过 1 2 \frac{1}{2} 21 年将能向上推 v 2 \frac{v}{2} 2v 的长度)。然而,宙斯并不希望 Sisyphus 太快到达山顶。宙斯可以施展 n n n 个魔法,若宙斯施展第 i i i 个魔法 ( 1 ≤ i ≤ n ) (1\leq i \leq n) (1in),则当 Sisyphus 第一次到达位置 a i a_i ai 时,他将会同巨石一起滚落下山底,并从头推起。(滚落的时间忽略不计,即可看作第一次到达位置 a i a_i ai 后 Sisyphus 立即从山底重新出发)

例如宙斯施用了 a i = 3 a_i=3 ai=3 a i = 5 a_i=5 ai=5 的两个魔法。Sisyphus 的速度 v = 1 v=1 v=1 ,山坡的长度 L = 6 L = 6 L=6,则他推石上山过程如下:

  • 3 3 3 年走到位置 3 3 3

  • a i = 3 a_i=3 ai=3 的魔法影响,回到了山底出发。

  • 再用 3 3 3 年走到位置 3 3 3,然而因为是第二次到达, a i = 3 a_i=3 ai=3 的魔法不起作用。

  • 2 2 2 年走到位置 5 5 5

  • a i = 5 a_i=5 ai=5 的魔法影响,回到了山底出发。

  • 6 6 6 年从山底走到了山顶。花费的总时间为 14 14 14 年。

现在,宙斯有 q q q 个询问。对于第 i i i 个询问 t i t_i ti,宙斯想知道,他最少需要施展多少个魔法才能使 Sisyphus 到达山顶所用的年数大于 t i t_i ti

输入格式

第一行三个整数 n , L , v n,L,v n,L,v 分别表示魔法的种类数,山坡的长度,Sisyphus 的速度。

第二行 n n n 个整数。第 i i i 个整数 a i a_i ai 表示第 i i i 个魔法作用的位置。 ( 1 < i < n ) (1<i<n) (1<i<n)

第三行一个整数 q q q 表示宙斯的询问个数。

接下来 q q q 行每行一个整数,第 i i i 行的整数 t i t_i ti 表示宙斯的第 i i i 个询问。 ( 1 < i < n ) (1<i<n) (1<i<n)

输出格式

输出 q q q 行,每行恰好一个整数,第 i i i 行的整数对应第 i i i 个询问的答案。 ( 1 ≤ i ≤ q ) (1 \leq i\leq q) (1iq)

如果宙斯无论如何都不能使 Sisyphus 使用的年数大于 t i t_i ti,请输出 − 1 -1 1

样例 #1

样例输入 #1

3 6 3
3 5 1
4
1
3
4
5

样例输出 #1

0
1
2
-1

提示

  1. 不使用任何魔法,Sisyphus 需要 2 2 2 年走上山顶。
  2. 使用魔法 2 2 2 ,Sisyphus 需要 11 3 \frac{11}{3} 311 年走上山顶。(用时 5 3 \frac{5}{3} 35 年走到魔法 2 2 2 的位置并滚落下山,再用时 6 3 = 2 \frac{6}{3}=2 36=2 年走到山顶)
  3. 使用魔法 1 , 2 1,2 1,2 ,Sisyphus 需要 14 3 \frac{14}{3} 314 年走上山顶。
  4. 宙斯不能使 Sisyphus 用大于 5 5 5 年的时间走上山顶。

对于测试点 1 ∼ 8 : n = 1 1\sim 8:n=1 18:n=1

对于测试点 9 ∼ 12 : n = 2 9\sim 12:n=2 912:n=2

对于测试点 13 ∼ 17 : n , q ≤ 1000 13\sim 17:n,q\le 1000 1317:n,q1000

对于所有测试点: 1 ≤ n , q ≤ 2 × 1 0 5 1 \leq n,q \leq 2 \times 10^5 1n,q2×105 1 ≤ v ≤ L ≤ 1 0 9 1\leq v\leq L\leq 10^{9} 1vL109 1 ≤ a i < L 1\leq a_i < L 1ai<L 1 ≤ t i ≤ 1 0 9 1 \leq t_i\leq 10^9 1ti109

数据保证 a i a_i ai 两两不同。

//【参考代码】
#include <iostream>
#include <algorithm>
using namespace std;
//末了:宙斯
const int N = 2e5+5;
int  n, l, v, q, a[N], t[N];
double tm[N];

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;
}
  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白话_NOI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值