螞蟻
一根長度為L厘米的木棍上有n只螞蟻,每隻螞蟻要麼朝左爬,要麼朝右爬,速度為1厘米/秒。當兩隻螞蟻相撞時,二者同時迴轉(迴轉時間忽略不計)。給出每隻螞蟻的初始位置和朝向,計算T秒之後每隻螞蟻的位置。
輸入格式:
輸入的第一行為資料群組數。每組資料的第一行為3個正整數L、T、n(0<=n<=10000);以下n行每行描述一隻螞蟻的初始位置,其中,整數x為螞蟻距離木棍左端的距離(單位:厘米),字母表示初始朝向(L表示朝左,R表示朝右)。
輸出格式:
對於每組資料,輸出n行,按輸入順序輸出每隻螞蟻的位置和朝向(Turing表示正在碰撞)。在第T秒之前已經掉下木棍的螞蟻(正好爬到木棍邊緣的不算)輸出Fell off。
範例輸入:
2
10 1 4
1 R
5 R
3 L
10 R
10 2 3
4 R
5 L
8 R
範例輸出:
Case #1:
2 Turing
6 R
2 Turing
Fell off
Case #2:
3 L
6 R
10 R
解:
#include<cstdio>#include<algorithm>using namespace std;const int maxn = 10000+5;const char dirName[][10] = {"L", "Turing", "R"};int order[maxn];//輸入的第i只螞蟻是終態中的左數第order[i]只螞蟻struct Ant{int id;//輸入順序int p;//位置int d;//朝向。-1:左;0:轉身中;1:右bool operator < (const Ant &a) const{return p < a.p;}}before[maxn], after[maxn];int main(){int K;scanf("%d", &K);for(int ki = 1; ki <= K; ki++){int L, T, n;scanf("%d%d%d", &L, &T, &n);for(int i = 0; i < n; i++){int p, d;char c;scanf("%d %c", &p, &c);d = (c=='L') ? -1 : 1;before[i].id = i; before[i].p = p; before[i].d = d;after[i].id = 0; after[i].p = p+T*d; after[i].d = d;//此處id還是未知的,用0代替}//計算次序數組sort(before, before+n);for(i = 0; i < n; i++)order[before[i].id] = i;//計算終態,保持原態或其它態sort(after, after+n);for(i = 0; i < n-1; i++)if(after[i].p == after[i+1].p) after[i].d = after[i+1].d = 0;//輸出結果printf("Case #%d:\n", ki);for(i = 0; i < n; i++){int a = order[i];//恢複輸入次序if(after[a].p < 0 || after[a].p > L) printf("Fell off\n");else printf("%d %s\n", after[a].p, dirName[after[a].d+1]);}printf("\n");}return 0;}
運行結果: