题目描述
英雄有两个数组A和B,两个数组的长度相同。英雄想要改变A,使得A和B距离尽量小。两个数组的距离指的是A和B有多少个对应位上的数字不相同。
英雄有一堆板子,每个板子上面有一个数字,恰好可以遮挡数组的一个位置。英雄需要把这堆板子全用完,并且数组的同一个位置最多只能放一个板子。
求最小的距离。
输入输出格式
输入格式
第一行为数据组数。
对于每组数据:
第一行为两个正整数N,M。表示数组A和B的长度以及板子的数量。 1 <= M <= N <= 50
第二行N个正整数为A数组。
第三行N个正整数为B数组。
第四行M个正整数为板子。
每个数字都不超过1000。
输出格式
对于每组数据,一行一个整数表示最小距离。
输入输出样例
输入样例
3
3 1
1 1 1
2 2 2
2
3 0
1 2 3
3 2 1
3 3
2 2 2
2 2 2
1 2 3
输入样例
2
2
2
题解
很明显的t贪心:先尽可能把数字不相同的位置覆盖成相同的,再把数字相同的位置覆盖成相同的,最后尽可能把剩下的数字不相同的位置覆盖成不相同的,剩下的就只能把数字相同的位置覆盖成不相同的。
#include <iostream> #include <cstdio> #include <cstring> #define MAX_N (1000 + 5) #define MAX_M (1000 + 5) #define NUMBER (1000 + 5) using namespace std; int G; int n, m; int a[MAX_N], b[MAX_N]; int c[NUMBER]; int ans; int main() { scanf("%d", &G); int tmp, tot; while(G--) { memset(c, 0, sizeof c); scanf("%d%d", &n, &m); ans = n; tot = 0; for(register int i = 1; i <= n; ++i) { scanf("%d", a + i); } for(register int i = 1; i <= n; ++i) { scanf("%d", b + i); if(a[i] == b[i]) --ans; else ++tot; } for(register int i = 1; i <= m; ++i) { scanf("%d", &tmp); ++c[tmp]; } for(register int i = 1; i <= n; ++i) { if(a[i] != b[i] && c[b[i]]) { --c[b[i]]; --tot; --m; --ans; } } for(register int i = 1; i <= n; ++i) { if(a[i] == b[i] && c[b[i]]) { --c[b[i]]; --m; } } printf("%d\n", ans + max(0, m - tot)); } return 0; }
参考程序
原文地址:https://www.cnblogs.com/kcn999/p/10585824.html
时间: 2024-11-11 02:03:17