《算法竞赛入门经典(第2版)》习题5-4 交换学生(Foreign Exchange, UVa 10763)

用了sort和map两种方法尝试去弄没弄出来,是算法的问题,没有看清题意,凭着感觉去找了规律,要注意仔细审题,主要讲学到的东西:

#include <iostream>
#include <set>
#include <cstring>
#include <sstream>
#include <algorithm>
using namespace std;
int a[3];
string s;
set<string>ss;
int main()
{
    int n=0;
    while(cin>>n&&n!=0)
    {
        int n1,n2=0;
        for(int i=n;i>0;i--)
        {
            cin>>a[0]>>a[1];
            stringstream pp;
            for(int j=0;j<=1;j++)
            {
                pp<<a[j];
                s=pp.str();
            }
            sort(s.begin(),s.end());
            if(find(ss.begin(),ss.end(),s)==ss.end()) {n1++;}
            else {ss.insert(s);n2++;}
        }
        if(n2%2==0&&n1%2==0&&n1!=0&&n2!=0) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    
}
#include <iostream>
#include <map>
using namespace std;
map<int,int>f;
int main()
{
    int n=0;
    while(cin>>n&&n!=0)
    {   int n2=0;int n1=0;f.clear();
        for(int i=n;i>0;i--)
        {
            int a1,a2=0;
            cin>>a1>>a2;
            if(f[a1]==a2&&f[a2]==a1) n1++;
            else n2++;
            f[a1]=a2;
            f[a2]=a1;
        }
        if(n2%2==0&&n1%2==0&&n1!=0&&n2!=0) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    
}

学到的:
1、在集合中查找特定元素:要声明库algorithm

if(find(ss.begin(),ss.end(),s)==ss.end()) {n1++;}
else {ss.insert(s);n2++;}    

这是在集合中找和string型的s匹配的元素,如果找到执行else,没有执行if。

2、整型数组转换为字符串(流转换)

stringstream pp;
            for(int j=0;j<=1;j++)
            {
                pp<<a[j];
                s=pp.str();
            }

注意要声明库sstream,不然会格式错误。

你可能感兴趣的:(《算法竞赛入门经典(第2版)》习题5-4 交换学生(Foreign Exchange, UVa 10763))