解题思路:贪心,统计每一个积分的权值,取权值大于等于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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论