全部货位最初都在册,翻转偶数次等价于不操作,翻转奇数次等价于下线一次。最优解只会把若干货位各下线一次,不会把已经下线的再翻回来。问题转化为:从序列中删去最少个数,使剩余数中不存在两个(可相同下标以外)之和等于阈值 t。
按数值分组统计出现次数后,冲突只可能发生在数值对 (x,t−x) 上,且各组互不干扰:
仓储调度台在出库前要对货位读数做配平检查。每个货位贴有一个正整数读数。规程写明:若仍处于「在册」状态的两个货位,读数之和恰好等于配平阈值,则视为配平冲突,出库流程会被拦截。起初全部货位都在册。值班员每次操作可将一个货位的在册状态翻转(在册变为不在册,或不在册变为在册)。求最少操作次数,使得不再存在配平冲突。
形式化地:给定 m 个正整数 v1,v2,…,vm 与配平阈值 t。初始时每个下标都在册。一次操作将某个下标的在册状态取反。出库扫描时,若存在下标 p,q(p=q)同时在册且
vp+vq=t,则判定为冲突。求使冲突不再出现所需的最少操作次数。
第一行两个正整数 m 和 t,表示货位数与配平阈值。
第二行 m 个正整数 v1,v2,…,vm,相邻两个数之间用一个空格隔开。
其中,1≤m≤100000,1≤t≤1000000000,1≤vi≤1000000000。
输出一个非负整数,表示最少操作次数。
输入
1 8
6
输出
0
说明
只有一个货位在册,无法取出两个下标,不构成配平冲突,不必操作。
输入
6 12
4 8 5 7 4 1
输出
2
说明
2 次,8 出现 1 次,关掉出现次数较少的一侧即可,需 1 次。1 次,再关掉一侧,需 1 次。合计 2 次。例如将唯一的 8 与唯一的 7 下线后,剩余 4,5,4,1,任意两数之和都不是 12。
输入
4 14
7 7 7 3
输出
2
说明
7+7=14,同类读数出现 3 次,至多保留 1 个在册,必须下线 2 个。读数 3 没有配平对象 11,可以全部保留。最少操作次数为 2。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册