码迷,mamicode.com
首页 > 编程语言 > 详细

Uva10881-算法入门经典训练指南

时间:2015-05-06 01:16:52      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

算法入门经典训练指南 第一章例题5

 

这道题个人感觉还是很有技术含量的,如果纯模拟可以搞死人。

这里面的一个蚂蚁在碰撞而掉头的情形,最后被看做是“对穿而过”,这种“转换思想”是非常厉害滴。。要是我有一天也有这种技能就好了

个人感觉如果看不出来,这道题就挂了。

所以在处理复杂问题上的时候,如果直接去做很复杂、很麻烦,那就应该想办法变通,比如像这道题目,我们寻找共同点,于是发现,他们的方向始终相反,速度始终相同,那么就可以看作是一毛一样地蚂蚁。

当然处理完了之后,还有一些小细节,比如所有蚂蚁的相对位置是不变的。。。

比较烦人的是输入输出顺序。并且由于排过序了,就有可能找不到原来的位置了,所以我们需要时时刻刻记录当前第i个是原来输入时的第几个。并引入了order。

重载比较运算符,以及结构体成员构造也是需要注意的技巧。

附上代码。

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

const int maxn=10000+5;

struct ant{
    int id;
    int pos;
    int dir;
    bool operator < (const ant &a)const{
        return pos<a.pos;
    }
}before[maxn],after[maxn];

const char dirName[][10]={"L","Turning","R","Fell off"};

int order[maxn];

int main()
{
    int K;
    scanf("%d",&K);
    for(int kase=1;kase<=K;kase++){
        int L,T,n;
        printf("Case #%d:\n",kase);
        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]=(ant){i,p,d};
            after[i]=(ant){0,p+T*d,d};
        }
        
        sort(before,before+n);
        sort(after,after+n);
        
        for(int i=0;i<n;i++)order[before[i].id]=i;
        
        for(int i=0;i<n-1;i++)
            if(after[i].pos==after[i+1].pos)after[i].dir=after[i+1].dir=0;
        
        for(int i=0;i<n;i++){
            int a=order[i];
            if(after[a].pos<0||after[a].pos>L)printf("%s\n",dirName[3]);
            else printf("%d %s\n",after[a].pos,dirName[after[a].dir+1]);
        } 
        printf("\n");
    }
    return 0;
}

 

Uva10881-算法入门经典训练指南

标签:

原文地址:http://www.cnblogs.com/happyJimmyLin/p/4480654.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!