zoukankan      html  css  js  c++  java
  • 蚂蚁 uva 10881

    思路:

      一,两个点相撞然后,相互弹开。这样其实和两个点穿过去差不多, 但是对于单个点而言,这样肯定不行。

      二,当你发现了不管什么情况,这些点的相对位置是不变的, 比如 1, 4, 3, 2 不管怎么移动,最后的这些点的相对位置依旧是 1, 4, 3, 2

    知道了这两点,其实就可以自己动手写了。

      我是这样做的,先记录点(包括下标), 然后根据位置排序,另外一个数组存下标,然后,再算各个点在经过T时间后,各个点的位置,再根据位置排序,然后,在利用所存下标的数组进行输出。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1e5+10;
    struct node{
        int index, x, y;
    }a[maxn];
    bool cmp(node a, node b){
        return a.x<b.x;
    }
    int b[maxn], t, T, L, n, h;
    
    int main(){
        cin>>t;
        while(t--){
            cin>>L>>T>>n;
            for(int i=0;i<n;++i)
            {   char h;
                a[i].index=i;
                cin>>a[i].x>>h;
                if(h=='L')a[i].y=-1;
                else a[i].y=1;
            }
            sort(a, a+n, cmp);
            for(int i=0;i<n;++i)
                b[i]=a[i].index;
    
            for(int i=0;i<n;++i){
                a[i].x+=a[i].y*T;
            }
    
            sort(a, a+n, cmp);
    
            for(int i=0;i<n;++i){
                int q=i;
                while(q+1<n&&a[q].x==a[q+1].x){++q;}
                if(q!=i){
                    for(int j=i; j<=q;++j)a[j].y=0;
                }
                i=q;
            }
            cout<<"Case #"<<++h<<":"<<endl;
            for(int i=0;i<n;++i){
                if(a[b[i]].x>L||a[b[i]].x<0)cout<<"Fell off"<<endl;
                else {
                    cout<<a[b[i]].x<<" ";
                    if(a[b[i]].y==-1)cout<<"L"<<endl;
                    else if(a[b[i]].y==1) cout<<"R"<<endl;
                    else cout<<"Turning"<<endl;
                }
            }
        }
    }

    书中的代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1e4+5;
    struct node{
        int id, p, d;
        bool operator < (const node &a)const{
            return p<a.p;
        }
    }before[maxn], after[maxn];
    const char dirName[][10]={"L", "Turning", "R"};
    
    int order[maxn];
    
    int main(){
        int k;
        cin>>k;
        for(int kase=1;kase<=k;++kase){
            int L, T, n;
            cout<<"Case #"<<kase<<":"<<endl;
            cin>>L>>T>>n;
            for(int i=0;i<n;++i){
                int p, d;
                char c;
                cin>>p>>c;
                d=(c=='L'?-1:1);
                before[i]=(node){i, p, d};
                after[i]=(node){0, p+T*d, d};
            }
            //计算order数组
            sort(before, before+n);
            for(int i=0;i<n;++i)order[before[i].id]=i;
            sort(after, after+n);
            for(int i=0;i<n-1;++i)
                if(after[i].p==after[i+1].p)after[i].d=after[i+1].d=0;
    
            for(int i=0;i<n;++i){
                int a=order[i];
                if(after[a].p<0||after[a].p>L)cout<<"Fell off"<<endl;
                else cout<<after[a].p<<" "<<dirName[after[a].d+1]<<endl;
            }
        }
    }
  • 相关阅读:
    HDU 1018 Big Number
    UVa 10603 倒水问题
    UVa 12108 特别困的学生
    UVa 1590 IP网络(简单位运算)
    UVa 12325 宝箱
    UVa 253 骰子涂色
    UVa 815 洪水!
    springmvc(2)处理器设配器和映射器
    SpringMVC(1)
    MyBatis(10)逆向工程
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10727863.html
Copyright © 2011-2022 走看看