• 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;
    }
    
  • 相关阅读:
    javaBean为什么要实现Serializable接口?
    OpenLayers3的WMS空间查询实现多个图层
    (WPS) 网络地理信息处理服务
    window.open跳过浏览器拦截
    linux改权限
    element-ui MessageBox的bug
    element-ui上传文件带token
    MySQL启动出现The server quit without updating PID file错误解决办法
    重装应用商店
    vscode在vue-cli中按照ESlint自动格式化代码
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740634.html
Copyright © 2020-2023  润新知