leading robots
題意:已知機械人v(t
)=a∗
tv(t)=a*t
v(t)=a
∗t,現有n
nn個機械人,給定機械人的當前位置pos
itio
nposition
positi
on,加速度a
aa。問經過無限長的時間後,有多少個機械人當過第一位?
思路:沒啥思路,最後肯定是a最大的機械人排在第一位,把他們畫成二維座標上的線可能會清楚一點。感覺要sort搞一搞,但是到最後都沒做出^^。
題目大意:給你每個機械人的初始位置和加速度,問你總共有多少個機械人有可能成為一次領導機械人(在最前面)。我們先給每個機械人的位置排序,按照位置最大的,加速度最大的優先,然後我們用棧來儲存每個可能成為領導的機械人的位置,加速度和其成為領導的時間,那麼很明顯,在後面的機械人,如果加速度小於等於當前的機械人,那麼他們是不可能成為領導人的,所以我們迴圈的時候可以直接continue。如果加速度大的話,那麼它一定能夠追上前面的機械人。
所以接下來我們要算一下它追上前面機械人的時間,希望大家的物理都學的不錯,有公式s=v
0t+1
2at2
s=v_0t+\fracat^2
s=v0t
+21
at2。那麼它追上前面那個機械人的世界就是當他們的路程一樣的時候,也就是
p os
tail
−pos
i+0t
+12a
tail
t2=0
t+12
ait2
pos_-pos_i+0t+\fraca_t^2=0t+\fraca_it^2
postai
l−p
osi
+0t+
21a
tail
t2=
0t+2
1ai
t2那麼為了使得我們的結果是準確的,我們將式子化為12t
2=po
stai
l−po
siai
−ata
il
\fract^2=\frac-pos_i}}
21t2=
ai−
atai
lpo
stai
l−p
osi
,那麼我們不用將t
tt算出來,只需要用他來比較大小,所以12t
2\fract^2
21t
2完全可以代替它的,接下來我們再用分數來儲存每個時間。
然後如果當前的機械人追上棧頂機械人的時間小於等於棧頂機械人成為領導人的時間,那麼我們將做出棧操作,也就是說棧頂的機械人在超越別人之前已經被人超越了。
最後需要判斷一下棧內是否有位置一樣,加速度一樣的元素,這個我們可以做個map來計數。
**:
好像還有二維凸包的做法,暫時不會^^struct fenshu
bool
operator
<=
(const fenshu &a)
const
bool
operator==(
const fenshu &a)
const
}times[maxn]
;mapint> mp;
struct node cun[maxn]
;bool
cmp(node a,node b)
stack<
int> houxuan;
stackq;
intmain()
sort
(cun +
1, cun +
1+ n, cmp)
; leader =1;
//int st;
houxuan.
push(1
);q.
push
(fenshu);
for(
int i =
2; i <= n; i++
)<= q.
top())
) q.
push
(fenshu);
houxuan.
push
(i);
}while
(!houxuan.
empty()
)printf
("%d\n"
, ans);}
return0;
}
待補
HDU 5818 多校 7 模擬
題意 對棧的操作,有兩個棧 a b然後接下來n組操作包括入棧,出棧,合併棧。合併棧按入棧的時間順序進行排序。官方題解 比較簡單巧妙的乙個做法是引入乙個新的棧 c 每次合併的時候就把a和 b 合併到 c上,然後把 a 和 b都清空.pu sh還是按正常做,po p 注意當遇到要pop的棧為空時,因為題...
HDU6034 多校聯合B題,25進製模擬
題意 給出數字n,然後給出n個字串,接下來給字母 a z 賦值,使這n個26進製數的和最大,注意不能有前導0 模擬就行了,不過排序時要雜湊一下 code include include include include include using namespace std typedef long ...
多校第一場 費馬小定理 模擬 組合數學
a題 couple doubi 這題逗逼了,剛開始根本就沒什麼思路,剛開始看題的時候有點像費馬小定理,可是這個定理我僅僅知道。然後沒用過。看了下定義,有點不一樣的是反著的。然後反著的我又不會轉化。尼瑪,就這樣錯過了最好的解題方法。然後隊友又理解錯題意了。wa了多發,然後我又一次看了下題意。然後隊友才...