Gym 102798AGolden Spirit
VJ鏈接
題意:
河的兩岸各有n個人,中間有個橋,過橋時間為t,所有人過橋后要休息x時間,你每次可以帶一個人過橋(每次最多只能帶一個人),問將所有人帶到對岸并帶回來,最短需要多少時間?
題解:
這題非常繞,如果沒有捋順關(guān)系就會懵逼
最佳策略是帶一個人到對岸后,這個人要休息,那我們就帶另一個人到對岸,相當(dāng)于每次盡量帶還沒過橋的人,當(dāng)所有人第一輪帶完后,開始往回帶,此時我們所在一側(cè)為起始位置,而我們這一側(cè)最早開始休息的人是第二次帶的人,對岸最早休息的人是第一次被帶的人,此時我們就考慮是過橋去對岸借第一個人,還是在本岸等第二個人休息好再帶過去。
這就有個比較,
我們設(shè)
t1=x-2ll*(n-1)t//表示第二次被帶過岸的人還需要多久能休息好(即本岸最早休息的人)
t2=x-(2lln-1)t//表示第一次被帶過岸的人還需要多久能休息好(即對岸最早休息的人)
t是題目所給,為過橋時間
x為休息時間
如果x<=(2lln-2)*t,說明當(dāng)?shù)谝惠啂曛?#xff0c;所有人都休息好了,此時無須等待直接再來一輪,總時間為4nt,即2n個人的過橋時間
如果t1>=max(t2,t),說明到,去對岸接第一次過橋的人更劃算
否則在原地等待第二次過橋的人更優(yōu)
給個樣例自己模擬模擬:
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*/總結(jié)
以上是生活随笔為你收集整理的Gym 102798AGolden Spirit的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 麦粒肿好了留下个疙瘩切了会疼么
- 下一篇: 喉咙痛该怎么办呀?好难受