Gym 102798AGolden Spirit

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym 102798AGolden Spirit相关的知识,希望对你有一定的参考价值。

VJ链接

题意:

河的两岸各有n个人,中间有个桥,过桥时间为t,所有人过桥后要休息x时间,你每次可以带一个人过桥(每次最多只能带一个人),问将所有人带到对岸并带回来,最短需要多少时间?

题解:

这题非常绕,如果没有捋顺关系就会懵逼
最佳策略是带一个人到对岸后,这个人要休息,那我们就带另一个人到对岸,相当于每次尽量带还没过桥的人,当所有人第一轮带完后,开始往回带,此时我们所在一侧为起始位置,而我们这一侧最早开始休息的人是第二次带的人,对岸最早休息的人是第一次被带的人,此时我们就考虑是过桥去对岸借第一个人,还是在本岸等第二个人休息好再带过去。
这就有个比较,
我们设
t1=x-2ll*(n-1)t//表示第二次被带过岸的人还需要多久能休息好(即本岸最早休息的人)
t2=x-(2ll
n-1)t//表示第一次被带过岸的人还需要多久能休息好(即对岸最早休息的人)
t是题目所给,为过桥时间
x为休息时间
如果x<=(2ll
n-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的主要内容,如果未能解决你的问题,请参考以下文章

C - Rencontre Gym - 102798C

L - Clock Master Gym - 102798L

G - Caesar Cipher Gym - 102798G

Steins;Game Gym - 102798J(未解决)

D - ABC Conjecture Gym - 102798D

H - Message Bomb Gym - 102798H