【题解】英雄数组

题目描述

  英雄有两个数组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

【题解】英雄数组的相关文章

【bzoj4310】跳蚤 后缀数组+二分

题目描述 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个,并在选出来的 k 个子串中选择字典序最大的那一个.他称其为“魔力串”. 现在他想找一个最优的分法让“魔力串”字典序最小. 输入 第一行一个整数 k. 接下来一个长度不超过 105 的字符串 S. 输出 输出一行,表示字典序最小的“魔力串”. 样例输入 13 bcbcbacbbbbbabbacbcb

【bzoj1511】[POI2006]OKR-Periods of Words KMP-next数组

原文地址:http://www.cnblogs.com/GXZlegend/p/6827027.html 题目描述 一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, 使得 A = PB. 如果 P A 并且 P 不是一个空串,那么我们说 P 是A的一个proper前缀. 定义Q 是A的周期, 当且仅当Q是A的一个proper 前缀并且A是QQ的前缀(不一定要是proper前缀). 比如串 abab 和 ababab 都是串abababa

NG2-我们创建一个可复用的服务来调用英雄的数据

<英雄指南>继续前行.接下来,我们准备添加更多的组件. 将来会有更多的组件访问英雄数据,我们不想一遍一遍地复制粘贴同样的代码. 解决方案是,创建一个单一的.可复用的数据服务,然后学着把它注入到那些需要它的组件中去. 我们将重构数据访问代码,把它隔离到一个独立的服务中去,让组件尽可能保持精简,专注于为视图提供支持. 在这种方式下,借助模拟服务来对组件进行单元测试也会更容易. 因为数据服务通常都是异步的,我们将在本章创建一个基于承诺 (Promise)的数据服务. 当然,一开始我们还是要让我们的程

poj 2299(离散化+树状数组)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 53777   Accepted: 19766 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swappin

【bzoj3670】[Noi2014]动物园 KMP-next数组

题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法. 某天,园长给动物们讲解KMP算法. 园长:“对于一个字符串S,它的长度为L.我们可以在O(L)的时间内,求出一个名为next的数组.有谁预习了next数组的含义吗?” 熊猫:“对于字符串S的前i个字符构成的子串,既是它的后缀又是它的前缀的字符串中(它本身除外),最长的长度记作next[i].” 园长:“非

【bzoj3238】[Ahoi2013]差异 后缀数组+单调栈

题目描述 输入 一行,一个字符串S 输出 一行,一个整数,表示所求值 样例输入 cacao 样例输出 54 题解 后缀数组+单调栈,几乎同 bzoj3879 的后半部分. 我明显是做题做反了... 这里还是说一下这道题的做法. 先用后缀数组求出height. 然后由于有LCP(a,c)=min(LCP(a,b),LCP(b,c))(rank[a]<rank[b]<rank[c]),所以我们只需要知道排名相邻的两个后缀的LCP,而这就是height数组的定义. 转化为子问题:给出n个数,求所有子

UVa12657 - Boxes in a Line(数组模拟链表)

题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令).3 X Y表示交换盒子X和Y的位置.4 表示反转整条链. 盒子个数n和指令条数m(1<=n,m<=100,000) 题解 用数组来模拟链表操作,对于每个节点设置一个前驱和后继. 1操作是把x的前驱节点和x的后继节点连接,y节点的前驱和x节点连接,x节点和y

【BZOJ4566】找相同字符(后缀数组)

[BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一个后缀,他们的\(lcp\)就是对答案产生的贡献 现在优化一下,按照\(SA\)的顺序枚举来处理\(lcp\) 利用一个单调栈维护一下,每次记录一下前面有多少个的贡献和当前答案一样就好啦 只是有点难写... #include<iostream> #include<cstdio> #in

BZOJ3230 相似子串 【后缀数组】

题目链接 BZOJ3230 权限题 题解 后缀数组基础题 询问第K大不同子串和正反lcp长度 如果您RE了,您就要知道询问的输入会爆LL #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #define Redge(u) for (int k = h[u],to; k; k =