未了(endless)

一、题目描述

由于触犯天神,Sisyphus 将要接受惩罚。
宙斯命 Sisyphus 推一块巨石上长度为的山坡。Sisyphus 匀速向上推的速度为每年的长度(由于是匀
速,故经过1/2年将能向上推v/2的长度)。然而,宙斯并不希望 Sisyphus 太快到达山顶。宙斯可以施展n个魔法,

若宙斯施展第个魔法(1 <= i <= n ),则当 Sisyphus 第一次到达位置时,他将会同巨石一起滚落下山底,并从头推起。

(滚落的时间忽略不计,即可看作第一次到达位置后 Sisyphus 立即从山底重新出发)

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

1. 用3年走到位置3。
2. 受 a[i] = 3的魔法影响,回到了山底出发。
3. 再用3年走到位置3,然而因为是第二次到达, a[i] = 3的魔法不起作用。
4. 用2年走到位置5。
5. 受 a[i] = 5的魔法影响,回到了山底出发。
6. 用6年从山底走到了山顶。花费的总时间为14年。
现在,宙斯有q个询问。对于第 i个询问 t[i],宙斯想知道,他最少需要施展多少个魔法才能使 Sisyphus 到达山顶所用的年数大于 t[i]
输入格式
第一行三个整数分别表示魔法的种类数,山坡的长度,Sisyphus 的速度。
第二行n个整数。第i个整数a[i]表示第 i 个魔法作用的位置。( 1 <= i <= n)
第三行一个整数q表示宙斯的询问个数。
接下来q行每行一个整数t[i],第i行的整数 t[i] 表示宙斯的第i个询问。(1 <= i <= q )
输出格式
输出q行,每行恰好一个整数,第 i 行的整数对应第 i 个询问的答案。(1 <= i <= q )
如果宙斯无论如何都不能使 Sisyphus 使用的年数大于,请输出。
样例输入
3 6 3
3 5 1
4
1
3
4
5
样例输出

0

1

2

-1

样例解释

1. 不使用任何魔法,Sisyphus 需要年走上山顶。
2. 使用魔法 ,Sisyphus 需要年走上山顶。(用时年走到魔法的位置并滚落下山,再用时
年走到山顶)
3. 使用魔法,Sisyphus 需要年走上山顶。
4. 宙斯不能使 Sisyphus 用大于年的时间走上山顶。

二、解题思路

输入魔法的位置 a[i], 按降序(从大到小)排序

1、把n个魔法存到year_num数组第n个位置

2、看year_num[n](所有魔法都用)能不能保证比宙斯想要的年份 (t[i])要大,如果所有魔法都用还比不上宙斯查询的 t[i] , 输出-1 

3、如果能比宙斯查询的年份要大,输出要用几个魔法

三、代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,l,v,a[200005],q,t[200005];
 6 double year_num[200005];
 7 
 8 bool cmp(int x, int y){
 9     return x > y;
10 }
11 
12 int main(){
13     //freopen("endless.in","r",stdin);
14     //freopen("endless.out","w",stdout);
15     cin >> n >> l >> v;
16     for(int i = 0;i < n;i++){
17         cin >> a[i];
18     }
19     sort(a,a+n,cmp);//降序排列 
20     cin >> q;
21     for(int i = 0;i < q;i++){
22         cin >> t[i];
23     }
24     year_num[0] = (double)l/v;//如果1个魔法都不用的话,就是山坡的高度除以每年爬的速度 
25     for(int j = 1;j <= n;j++){
26         year_num[j] = year_num[j-1] + (double)a[j-1]/v;
27     }
28     int j = 0, i = 0;//i待会要作为t数组的下标,所以不能作为year_num的下标
29     //所以加了个j,如果这次year_num[j]比t[i]小的话,j++(判断year_num的下一个),而i不能++ 
30     while(i < q){
31         if(year_num[n] <= t[i]){//所有魔法都用上也不能比查询的年数要大 
32             cout << -1 << endl;//不可能达到宙斯的查询,输出1 
33             i++;//下一个循环该判断下一个查询的年数了 
34             continue;
35         }
36         if(year_num[j] > t[i]){//如果只用j个魔法就比t[i]大了 
37             cout << j << endl;//输出j 
38             i++;//判断下一个查询 
39         }else{
40             j++;//只用j个魔法不行,多用一个魔法试试 -> j++ 
41         }
42         i = 0;
43         j = 0; 
44     }
45     return 0;
46 }
原文地址:https://www.cnblogs.com/elisa02/p/12780069.html