當前位置:編程學習大全網 - 編程語言 - 編程童神

編程童神

基本思想是計算每輪相鄰機器人的碰撞時間,從小到大依次排列然後依次碰撞。

剩余機器人的相鄰關系會發生變化,因此會重新計算碰撞時間,並重復上述步驟,直到不發生碰撞。

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;

}

給定的測試用例已經通過,但是還需要更多的測試用例來檢驗是否正確。希望采納他們~

  • 上一篇:初中信息技術教案[五]
  • 下一篇:我的世界如何做石磚樓梯
  • copyright 2024編程學習大全網