白羽啊


私信TA

用户名:723822380

访问量:3187

签 名:

等  级
排  名 4467
经  验 1690
参赛次数 0
文章发表 22
年  龄 0
在职情况 学生
学  校 泉师
专  业

  自我简介:

解题思路:贪心,统计每一个积分的权值,取权值大于等于0的积分,权值=该积分的人数-(积分+k)的人数-(积分-k)的人数,因为选了该积分,那么相差k的都不能选,如果权值大于等于0说明,选该积分能提供的人数多于等于它排除的人数,可以选择
注意事项:在这个网站AC了,但在官网只对了1个,后面全是错误,没VIP看不了,求大佬指导

参考代码:

import collections


n, k = map(int, input().strip().split())
nums = list(map(int, input().strip().split()))
count = collections.Counter(nums)#统计各积分对应的人数
weight = [[float("-inf"), 0, 0, 0] for _ in range(200001)]#四个值分别对应:权值,积分,积分+k,积分-k(后三个是为了flag判断存储的下标)
flag = [True for _ in range(200001)]#标记是否能选择
if k == 0:#k=0说明只要统计有几种不同的积分即可
    print(len(set(nums)))
else:
    for each in count.keys():
        weight[each][0] = count[each] - count[each + k] - count[each - k]#计算权值
        weight[each][1] = each
        weight[each][2] = each - k
        weight[each][3] = each + k
    weight.sort(key = lambda x: x[0], reverse = True)#这里进行了降序排序,原来的下标会被打乱,无法对应原flag,所以有了上面的后三个值
    max_num = 0
    for i in range(len(weight)):
        if weight[i][0] < 0:#说明不可能被选择,因为有更好的选择
            break
        if flag[weight[i][1]]:#如果可选
            max_num += count[weight[i][1]] #加上积分对应的人数
            flag[weight[i][2]], flag[weight[i][3]] = False, False # 把相差k的给标记为False
    print(max_num)


 

0.0分

0 人评分

  评论区

  • «
  • »