剩余機器人的相鄰關系會發生變化,因此會重新計算碰撞時間,並重復上述步驟,直到不發生碰撞。
C++代碼如下:
# include & ltbits/stdc++。h & gt// C++通用頭文件
使用命名空間std
使用tri = tuple & ltdouble,int,int & gt;//碰撞時間和機器人編號
int main() {
int n,k;
CIN & gt;& gtn;
k = n;//剩下的機器人數量
int x[n + 1],v[n+1];//初始位置和速度
for(int I = 1;我& lt= n;++i) //編號從1開始。
CIN & gt;& gtx[I]& gt;& gt五[壹];
int崩潰[n+1];//標記發生碰撞的機器人。
memset(崩潰,0,sizeof(崩潰));
優先級隊列& lttri,vector & lttri & gt,greater & lttri & gt& gtpq;//小根堆
while(k & gt;= 2) {//至少兩個機器人可以碰撞。
int I = 1;
while(我& ltn & amp& amp崩潰[I])++ I;
while(我& ltn) {
int j = I+1;//計算與右邊機器人的碰撞時間。
while(j & lt;= n & amp& ampcrash[j])++ j;
if(j & gt;n)斷開;
long d = x[j]-x[I];
if(v[I]& lt;= 0 & amp& ampv[j]& lt;V[i] // j命中I
| |(v[I]& gt;0 & amp& ampv[j]& lt;v[I]){//我打了j。
long delta _ v = v[I]-v[j];
雙t = d * 1.0/delta _ v;
pq .炮位(t,I,j);
}
I = j;
}
if(pq . empty())break;//沒有機器人相撞。
而(!pq.empty()) {
auto t = pq . top();
pq . pop();
int ii = get & lt1 & gt;(t),jj = get & lt2 & gt(t);
如果(!崩潰ⅱ& amp;& amp!Crash[jj]) {//他們還在的時候才能碰撞。
崩潰[ii] =崩潰[jj]= 1;
k-= 2;
}
}
}
cout & lt& ltk & lt& lt”\ n”;
for(int I = 1;我& lt= n;++i) {
如果(!崩潰[我])
cout & lt& lt我& lt& lt" ";
}
cout & lt& lt”\ n”;
返回0;
}
給定的測試用例已經通過,但是還需要更多的測試用例來檢驗是否正確。希望采納他們~