题目链接:​​http://codeforces.com/contest/779/problem/A​​​
题意:给你两个长度为n的序列,序列里的元素1<=a[i]<=5,现让你交换两个序列的元素,使得每个序列的每个元素值的个数相等,问你最少交换几次
解析:首先每个元素出现的次数必须是偶数,如果不是则输出-1,接着求每个元素在自己序列出现的个数,最少交换次数则为,每个元素出现个数之差除2,在求和除2

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <set>
#include <map>
using namespace std;
const int maxn = 1e5+100;
int vis1[10];
int vis2[10];
int main()
{
int n;
scanf("%d",&n);
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
int x;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
vis1[x]++;
}
for(int i=0;i<n;i++)
{
scanf("%d",&x);
vis2[x]++;
}
int sum = 0;
int flag = 0;
for(int i=0;i<10;i++)
{
if((vis1[i]+vis2[i])%2)
{
flag = 1;
break;
}
}
if(flag)
puts("-1");
else
{
for(int i=0;i<10;i++)
{
if(vis1[i]||vis2[i])
sum += abs(vis1[i]-vis2[i])/2;
}
printf("%d\n",sum/2);
}
return 0;
}