OpenJudge 3064 墜落的螞蟻

2022-05-09 19:11:30 字數 2099 閱讀 4534

[openjudge 3064]墜落的螞蟻

試題描述

一根長度為1公尺的木棒上有若干只螞蟻在爬動。它們的速度為每秒一厘公尺或靜止不動,方向只有兩種,向左或者向右。如果兩隻螞蟻碰頭,則它們立即交換速度並繼續爬動。三隻螞蟻碰頭,則兩邊的螞蟻交換速度,中間的螞蟻仍然靜止。如果它們爬到了木棒的邊緣(0或100厘公尺處)則會從木棒上墜落下去。在某一時刻螞蟻的位置各不相同且均在整數厘公尺處(即1,2,3,…99厘公尺),有且只有乙隻螞蟻a速度為0,其他螞蟻均在向左或向右爬動。給出該時刻木棒上的所有螞蟻位置和初始速度,找出螞蟻a從此時刻到墜落所需要的時間。

輸入

第一行包含乙個整數表示螞蟻的個數n(2<=n<=99),之後共有n行,每一行描述乙隻螞蟻的初始狀態。每個初始狀態由兩個整數組成,中間用空格隔開,第乙個數字表示初始位置厘公尺數p(1<=p<=99),第二個數字表示初始方向,-1表示向左,1表示向右,0表示靜止。

輸出

螞蟻a從開始到墜落的時間。若不會墜落,輸出「cannot fall!」

輸入示例

4101

90095 -1

98 -1

輸出示例

98

資料規模及約定

見「輸入

題解

如果不考慮螞蟻的編號,觀察當兩隻螞蟻撞上後調換方向其實和互相穿過沒什麼區別,所以能掉出去的螞蟻一定會在 100 步內掉出(我們可以假設螞蟻可以互相穿過,那麼最晚掉下去的螞蟻要麼是開始時最左邊向右走的或是最右邊向左走的,而它們掉下去的步數顯然不會超過 100)。

那麼就暴力模擬 100 步咯。(有許多細節,不如拆成 200 步走,即每兩個時刻的正中間再加乙個時刻。)

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int buffersize = 1 << 16;

char buffer[buffersize], *head, *tail;

inline char getchar()

return *head++;

}int read()

while(isdigit(c))

return x * f;

}#define maxn 110

int n;

struct ant

ant(int _, int __, int ___): x(_), v(__), id(___) {}

void move()

bool operator < (const ant& t) const

} as[maxn];

bool cmp(ant a, ant b)

int main()

bool ok = 0;

for(int i = 1; i <= 200; i++)

as[j].has = 0;

}else if(as[j].x == as[j+1].x && as[j+1].x == as[j+2].x) swap(as[j].v, as[j+2].v), sort(as + j, as + j + 3), j++;

else if(as[j].x == as[j+1].x) swap(as[j].v, as[j+1].v), sort(as + j, as + j + 2);

}if(ok) break;

// sort(as + 1, as + n + 1, cmp);

// for(int j = 1; j <= n; j++) if(as[j].x < 10) printf("%d %d %d\n", as[j].id, as[j].x, as[j].v); putchar('\n');

} if(!ok) puts("cannot fall!"); }

return 0;

}

BZOJ3064 CPU監控(線段樹)

bzoj 洛谷神仙zs y zsy 出在了no ipn oi p模擬的題目。然而zs y zsy 出的還是這題的公升級版 首先明確一點,這題是乙個吉司機線段樹。如果只有區間加法,區間賦值,區間最大值,那麼這題很簡單。但是加上了乙個區間歷史最值,這就很煩了。於是我們就有了乙個神仙做法,定義乙個表示 a...

openjudge 數字統計

總時間限制 1000ms 記憶體限制 100000kb 描述輸入n個整數,統計每個數出現的次數.輸入 第一行是乙個整數n 1 n 1000 接下來n行每行乙個整數.輸出 第一行輸出總共有多少個不同的整數.接下來每行輸出乙個整數及這個整數出現的次數,用空格分隔.輸出的整數的順序與它們在輸入中第一次出現...

Openjudge 括號匹配

這個用了普通的迴圈,資料量不是很大的話效率還是不錯的,如果資料比較大的話,換別的方法可能效率會高一點。思路很簡單 以字串中是否還存在沒有匹配過的 作為這個字串已經處理完畢的標誌。1,讀入字串,並進行處理,把所有不是 和 的字元都轉換成空格。2,從開始掃瞄字串,如果掃瞄到 記錄 的位置,直到掃瞄到 3...