Pupils Redistribution

题目链接:Pupils Redistribution

 

题目大意:

给两个数组A和B,元素均为1到5(包含端点),可以选择A中一个数和B中一个数进行交换,问最少交换多少次可以使得两个数组中1的个数相同,2的个数相同,3的个数相同,4的个数相同,5的个数相同。

 

思路:

记录两个数组中每个数出现的次数,假设分别为a,b,如果某个数出现的次数和为奇数,则输出-1(原因显然),然后累加每个数个数之差绝对值的一半,假设为s,最后输出s/2(因为有重复,调整一个数时,他可能已经被上一个数调整过了)

 

参考代码:

Pupils Redistribution
 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

 

上一篇:CF1453C Solution


下一篇:keil之error: #70: incomplete type is not allowed