【发布时间】:2019-09-18 12:41:39
【问题描述】:
考虑出现在 Codeforces(额定 1500)中的这个问题:
有n个拳击手,第i个拳击手的重量是ai。他们每个人在比赛前可以改变权重不超过1(权重不能变为零,即必须保持正数)。权重始终是整数。
需要选择人数最多的拳击队,团队中所有拳击手的体重都不同(即唯一)。
编写一个程序,对于给定的当前值,ai 将找到一个团队中可能的最大拳击手数。
有可能一些拳击手的体重在一些改变后是 150001(但不会更多)。
输入 : 第一行包含一个整数 n (1≤n≤150000)——拳击手的数量。下一行包含 n 个整数 a1,a2,…,an,其中 ai (1≤ai≤150000) 是第 i 个拳击手的体重。
输出 :打印一个整数——团队中可能的最大人数。
这是我实现的代码,被 Codeforces 接受为正确提交(Python 3.7):
n=int(input())
inputlist=list(map(int, input().split()))
inputlist.sort()
boxerset=set()
for i in inputlist:
if i-1 not in boxerset and i!=1:
boxerset.add(i-1)
elif i not in boxerset:
boxerset.add(i)
elif i+1 not in boxerset:
boxerset.add(i+1)
else:
continue
print(len(boxerset))
但是,我无法严格证明该算法一定会给出正确答案。例如,当 inputlist 为 [1, 1, 1, 2, 2, 5 , 8] 时,[1, 2, 3, 4, 7, 8](我的算法)和 [1, 2, 3, 6, 7, 8] 是正确的输出 boxerset,尽管这两种情况的答案都是 6。
我的问题是这样的:
如何证明我的算法是正确的?我的证明如何证明在所有可能的合法拳击手选择中,我的算法选择的拳击手数量最多(这就是我如何证明我不存在其他选择拳击手的数量可以是大于我的算法所做的选择)?
我尝试过反证法但无济于事(尽管我认为证明必须具有反证法的自然结构)。
【问题讨论】:
标签: algorithm proof proof-of-correctness