题目大意:
给两个数组A和B,元素均为1到5(包含端点),可以选择A中一个数和B中一个数进行交换,问最少交换多少次可以使得两个数组中1的个数相同,2的个数相同,3的个数相同,4的个数相同,5的个数相同。
思路:
记录两个数组中每个数出现的次数,假设分别为a,b,如果某个数出现的次数和为奇数,则输出-1(原因显然),然后累加每个数个数之差绝对值的一半,假设为s,最后输出s/2(因为有重复,调整一个数时,他可能已经被上一个数调整过了)
参考代码:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() { 6 int n,a[110],b[110],f[6],aa[6],bb[6]; 7 memset(f,0,sizeof(f)); 8 memset(aa,0,sizeof(aa)); 9 memset(bb,0,sizeof(bb)); 10 cin >> n; 11 for(int i = 1; i <= n; i++) { 12 cin >> a[i]; 13 f[a[i]]++; 14 aa[a[i]]++; 15 } 16 for(int i = 1; i <= n; i++) { 17 cin >> b[i]; 18 f[b[i]]++; 19 bb[b[i]]++; 20 } 21 for(int i = 1; i <= 5; i++) { 22 if(f[i] & 1) { 23 cout << -1 << endl; 24 return 0; 25 } 26 } 27 int s = 0; 28 for(int i = 1; i <= 5; i++) { 29 s += abs(aa[i]-bb[i])/2; 30 } 31 cout << s/2 << endl; 32 return 0; 33 }View Code