UVA 10763 Foreign Exchange

来源:互联网 发布:复制网站源码 编辑:程序博客网 时间:2024/06/05 20:38

题意:n个学生要当交换生,每个学生想从A校换到B校,交换条件是找到一个想要从B换到A的学生配对,每个学生只能配对一次,问这些学生能不能都成功交换。

思路:这题挺简单的,首先是配对的问题,由于对于每个学生,A和B是不同的,因此可以把学生分成两组,一组是A<B的,一组是A>B的,这样能配对的组合一定是第一组和第二组的两个学生,那么把这两个集合排序,然后依次看能否匹配即可。


代码:


#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<set>#include<stack>#include<cmath>#include<vector>#define inf 0x3f3f3f3f#define Inf 0x3FFFFFFFFFFFFFFFLL#define eps 1e-9#define pi acos(-1.0)using namespace std;typedef long long ll;const int maxn=500000+10;struct Node{    int x,y;    Node (){};    Node (int xx,int yy){x=xx;y=yy;}};Node S[maxn],T[maxn];bool cmp1(Node a,Node b){    return (a.x==b.x&&a.y<b.y)||(a.x<b.x);}bool cmp2(Node a,Node b){    return (a.y==b.y&&a.x<b.x)||(a.y<b.y);}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int n,m1,m2;    while(~scanf("%d",&n))    {        if(n==0) break;        bool flag=true;        m1=m2=0;        int xx,yy;        for(int i=0;i<n;++i)        {            scanf("%d%d",&xx,&yy);            if(xx<yy) S[m1++]=Node(xx,yy);            else T[m2++]=Node(xx,yy);        }        if(m1!=m2) flag=false;        else        {            sort(S,S+m1,cmp1);            sort(T,T+m1,cmp2);            for(int i=0;i<m1;++i)                if(S[i].x!=T[i].y||S[i].y!=T[i].x)                {flag=false;break;}        }        if(flag) printf("YES\n");        else printf("NO\n");    }    return 0;}

0 0
原创粉丝点击