10881 - Piotr‘s Ants (UVA)

本文介绍了解决在线编程问题中蚂蚁赛跑路径问题的一种算法实现,通过比较和优化结构体元素,减少超时错误,以提高代码效率。作者对比了两种代码版本并进行了性能优化。
摘要由CSDN通过智能技术生成

题目链接:Online Judge

根据刘汝佳的解法的思路,我的代码如下:

#include <cstdio>
#include <algorithm>
#include <string>
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 <cstdio>
#include <deque>
#include <set>
#include <algorithm>

struct ant{
    int id;
    int loc;
    int direction;
    bool turnFlag = false;
};
int N, L, T, n, loc;
char ch;
std::deque<ant> 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值