原题链接:蓝桥杯2017年第八届真题-对局匹配
解题思路:贪心,统计每一个积分的权值,取权值大于等于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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复