Gym 102798AGolden Spirit
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym 102798AGolden Spirit相关的知识,希望对你有一定的参考价值。
题意:
河的两岸各有n个人,中间有个桥,过桥时间为t,所有人过桥后要休息x时间,你每次可以带一个人过桥(每次最多只能带一个人),问将所有人带到对岸并带回来,最短需要多少时间?
题解:
这题非常绕,如果没有捋顺关系就会懵逼
最佳策略是带一个人到对岸后,这个人要休息,那我们就带另一个人到对岸,相当于每次尽量带还没过桥的人,当所有人第一轮带完后,开始往回带,此时我们所在一侧为起始位置,而我们这一侧最早开始休息的人是第二次带的人,对岸最早休息的人是第一次被带的人,此时我们就考虑是过桥去对岸借第一个人,还是在本岸等第二个人休息好再带过去。
这就有个比较,
我们设
t1=x-2ll*(n-1)t//表示第二次被带过岸的人还需要多久能休息好(即本岸最早休息的人)
t2=x-(2lln-1)t//表示第一次被带过岸的人还需要多久能休息好(即对岸最早休息的人)
t是题目所给,为过桥时间
x为休息时间
如果x<=(2lln-2)*t,说明当第一轮带完之后,所有人都休息好了,此时无须等待直接再来一轮,总时间为4nt,即2n个人的过桥时间
如果t1>=max(t2,t),说明到,去对岸接第一次过桥的人更划算
否则在原地等待第二次过桥的人更优
给个样例自己模拟模拟:
1
1 10 2
ans=16
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,x,t;
cin>>n>>x>>t;
ll t1=x-2ll*(n-1)*t;
ll t2=x-(2ll*n-1)*t;
if(x<=(2ll*n-2)*t)cout<<4ll*n*t<<endl;
else if(t1>=max(t2,t)){
cout<<4ll*n*t+max(t2,t)<<endl;
}
else cout<<t1+4ll*n*t<<endl;
// else if(x>=(2ll*n-1)*t+t)cout<<4ll*n*t+(x-(2ll*n-1)*t-t)<<endl;
// else cout<<x-(2ll*n-2)*t+4ll*n*t<<endl;
}
return 0;
}
/*
1 2
2:|21
4:2|1
*/
以上是关于Gym 102798AGolden Spirit的主要内容,如果未能解决你的问题,请参考以下文章
L - Clock Master Gym - 102798L
G - Caesar Cipher Gym - 102798G
Steins;Game Gym - 102798J(未解决)