zoukankan      html  css  js  c++  java
  • UVa 10763

    题意

    交换生,每个人有起始地和目的地,交换需要满足的条件是如果一个学生要从1交换到2,则必须有另一学生从2交换到1处,才能完成交换

    Input
    2
    1 2
    2 1
    2
    1 2
    1 2
    0
    Output
    YES
    NO

    TLE代码

    之前考虑用map< pair< int,int >, int >
    键存学生的起始地和目的地,值是学生编号
    用迭代器迭代,如果查找到相反匹配的则弹出原来的
    最后检查容器是否为空即可
    但问题是每次iterator是阶乘的复杂度,结果超时

    #include <iostream>
    #include <cstdio>
    #include <map>
    
    using namespace std;
    
    typedef pair<int,int> ss;
    map<int,ss> mrk;
    
    int main()
    {
        int T, n, a, b;
        while( cin >> T && T ){
            bool flag = true;
            if( T % 2 != 0 )    flag = false;
            for( n = 0; n < T; n++ ){
                cin >> a >> b;
                if( !flag ) continue;
                ss p(a,b);
                ss f(b,a);
                if( !mrk.empty() )
                {
                    bool ff = false;
                    map<int,ss>::iterator it = mrk.begin();
                    for( ; it != mrk.end(); it++ ){
                        if( it->second.first == b && it->second.second == a ){
                            //cout << "size:" << mrk.size() << endl;
                            mrk.erase(it);
                            //cout << "size:" << mrk.size() << endl;
                            ff = true;
                            break;
                        }
                    }
                    if(ff)  continue;
                }
                pair<int,ss> pp(n,p);
                mrk.insert(pp);
                //cout << mrk.size() << endl;
            }
            if( flag && mrk.size() )    flag = false;
            if(flag)    cout << "YES" << endl;
            else    cout << "NO" << endl;
            if( !mrk.empty() )  mrk.clear();
        }
        return 0;
    }

    AC代码

    借鉴思路,存成两个结构体数组,第一个存入a,b,第二个存入b,a
    分别sort排序,比较两个结构体数组,如果完全相同则是YES
    若遇到不同直接输出NO并break

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    struct stu
    {
        int a,b;
    };
    struct stu p[500000+100], s[500000+100], temp;
    
    bool cmp( struct stu x, struct stu y )
    {
        if(x.a == y.a)
            return  x.b < y.b;
        return x.a < y.a;
    }
    
    int main()
    {
        int T, i;
        while( scanf("%d",&T) && T ){
                bool flag = true;
            for( i = 0; i < T; i++ ){
                scanf("%d%d",&p[i].a,&p[i].b);
                s[i].b = p[i].a;
                s[i].a = p[i].b;
            }
            sort(p,p+T,cmp);
            sort(s,s+T,cmp);
            for( i = 0; i < T; i++ ){
                if( p[i].a != s[i].a || p[i].b != s[i].b ){
                    puts("NO");
                    flag = false;
                    break;
                }
            }
            if(flag)  puts("YES");
        }
        return 0;
    }
    
  • 相关阅读:
    table问题
    生成跟相应qq聊天
    查数组 indexOf()用法
    Ajax请求数据的两种方式
    Ajax面试题
    内部类及静态内部类的实例化
    为什么在开发中大部分的时候都在用session而Application基本上都不去使用?
    Java序列化与反序列化
    Java反射机制
    Java中线程同步的方法
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740634.html
Copyright © 2011-2022 走看看