题目链接:Online Judge
根据刘汝佳的解法的思路,我的代码如下:
- #include
- #include
- #include
- const int maxn = 10001;
-
- struct ant{
- int id;
- int loc;
- int dir;
- };
-
- bool cmp(const ant &a, const ant &b){
- return a.loc < b.loc;
- }
-
- bool cmp1(const ant &a, const ant &b){
- return a.id < b.id;
- }
-
- ant a[maxn], b[maxn];
- int order[maxn];
- int N, L, T, n;
- char ch;
- std::string direction[3] = {"L", "Turning", "R"};
-
- int main(){
- scanf("%d", &N);
- for(int kase = 1; kase <= N; ++kase){
- printf("Case #%d:\n", kase);
- scanf("%d %d %d", &L, &T, &n);
- for(int i = 0; i < n; ++i){
- scanf("%d %c", &a[i].loc, &ch);
- a[i].id = i;
- a[i].dir = ch == 'L' ? -1 : 1;
- }
- std::sort(a, a + n, cmp);
- for(int i = 0; i < n; ++i){
- order[i] = a[i].id;
- b[i].loc = a[i].loc + a[i].dir * T;
- b[i].dir = a[i].dir;
- }
- std::sort(b, b + n, cmp);
- for(int i = 0; i < n; ++i){
- b[i].id = order[i];
- if(i != n - 1 && b[i].loc == b[i + 1].loc){
- b[i].dir = 0;
- b[i + 1].dir = 0;
- }
- }
- std::sort(b, b + n, cmp1);
- for(int i = 0; i < n; ++i){
- if(b[i].loc < 0 || b[i].loc > L){
- printf("Fell off\n");
- } else{
- printf("%d %s\n", b[i].loc, direction[b[i].dir + 1].c_str());
- }
- }
- printf("\n");
- }
- return 0;
- }
我起先的代码如下,样例答案是对的,但提交时显示超时:
- #include
- #include
- #include
- #include
-
- struct ant{
- int id;
- int loc;
- int direction;
- bool turnFlag = false;
- };
- int N, L, T, n, loc;
- char ch;
- std::deque
de; - std::set<int> fellOff;
-
- bool cmp(const ant &a, const ant &b){
- return a.loc < b.loc;
- }
-
- bool cmp1(const ant &a, const ant &b){
- return a.id < b.id;
- }
-
- int main(){
- scanf("%d", &N);
- for(int kase = 1; kase <= N; ++kase){
- scanf("%d %d %d", &L, &T, &n);
- de.clear();
- de.resize(n);
- for(int i = 0; i < n; ++i){
- scanf("%d %c", &de[i].loc, &ch);
- de[i].id = i;
- de[i].direction = ch == 'L' ? -1 : 1;
- }
- sort(de.begin(), de.end(), cmp);
- for(int i = 0; i < T; ++i){
- if(de[0].loc == 0 && de[0].direction == -1){
- fellOff.insert(de[0].id);
- de.pop_front();
- }
- if(de.back().loc == L && de.back().direction == 1){
- fellOff.insert(de.back().id);
- de.pop_back();
- }
- for(int j = 0; j < de.size(); ++j){
- if(de[j].direction == -1){
- de[j].loc--;
- } else{
- if(j == de.size() - 1){
- de[j].loc++;
- } else if(de[j + 1].loc > de[j].loc + 2 || de[j + 1].direction == 1){
- de[j].loc++;
- } else{
- if(de[j + 1].loc == de[j].loc + 2){
- de[j].loc++;
- de[j + 1].loc--;
- }
- de[j].direction = -1;
- de[j + 1].direction = 1;
- j++;
- }
- }
- }
- }
- for(int i = 0; i < de.size(); ++i){
- if((i != de.size() - 1 && de[i + 1].loc == de[i].loc) || (i != 0 && de[i - 1].loc == de[i].loc)){
- de[i].turnFlag = true;
- }
- }
- sort(de.begin(), de.end(), cmp1);
- int cur = 0;
- printf("Case #%d:\n", kase);
- for(int i = 0; i < n; ++i){
- if(fellOff.find(i) != fellOff.end()){
- printf("Fell off\n");
- } else{
- printf("%d ", de[cur].loc);
- if(de[cur].turnFlag){
- printf("Turning\n");
- } else{
- printf("%c\n", de[cur].direction == -1 ? 'L' : 'R');
- }
- cur++;
- }
- }
- printf("\n");
- fellOff.clear();
- }
- return 0;
- }