CF
来源:互联网 发布:c语言技术面试题目 编辑:程序博客网 时间:2024/04/29 11:54
1.题目描述:
2.题意概述:
给你两组数列A和B,要你通过最小的交换次数使得A和B完全相等
3.解题思路:
先预处理一下A和B的每一个元素,如果存在(a[i]+b[i])是奇数,则肯定不能够通过若干次交换使得a[i] == b[i],如果是偶数,那么就进行abs(a[i] - b[i]) / 2次交换,这样贪心地保证了第i位数是相同的,然后对于a的任意一次交换必然影响b,所以结果除以2即可
4.AC代码:
include <bits/stdc++.h>#define INF 0x3f3f3f3f#define maxn 100100#define N 111#define eps 1e-6#define pi acos(-1.0)#define e 2.718281828459#define mod (int)1e9 + 7using namespace std;typedef long long ll;int visa[6], visb[6];int main(){#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);long _begin_time = clock();#endifint n;while (~scanf("%d", &n)){memset(visa, 0, sizeof(visa));memset(visb, 0, sizeof(visb));for (int i = 0; i < n; i++){int x;scanf("%d", &x);visa[x]++;}for (int i = 0; i < n; i++){int x;scanf("%d", &x);visb[x]++;}int flag = 0, ans = 0;for (int i = 1; i <= 5; i++){if ((visa[i] + visb[i]) & 1){flag = 1;break;}ans += abs(visa[i] - visb[i]) / 2;}printf("%d\n", flag == 1 ? -1 : ans / 2);}#ifndef ONLINE_JUDGElong _end_time = clock();printf("time = %ld ms.", _end_time - _begin_time);#endifreturn 0;}
0 0