前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一题 | 不确定参与人数的抽奖问题

每日一题 | 不确定参与人数的抽奖问题

作者头像
TechFlow-承志
发布2020-08-05 11:27:23
6450
发布2020-08-05 11:27:23
举报
文章被收录于专栏:TechFlowTechFlow

昨日问题

每日一题 | 两个序列归并问题

题目同样源于codeforces,链接:https://codeforces.com/gym/102646/problem/B

这是一道经典的贪心问题,由于我们可以随意地从A和B中获取元素,我们又希望得到的结果的字典序最小。我们很容易分析出要尽量将小的元素放在前面,而大的元素放在后面。

基于这样的原理,我们很容易想到算法,可以用两个指针分别指向A和B的开头。每次都选择其中较小的那一个。比如1 3 5和2 4 6,一开始是1和2比,由于1小于2,所以选择1。A的指针移动一位指向3,下一轮比较3和2,由于2小于3,所以选择2。如此循环往复直到所有元素都被取完为止。

我们观察一下样例,这个算法都可以支持。

但是这里藏了一个trick,如果A和B的元素相等,那么应该怎么办呢?是随便取哪个都行吗,还是?

比如A是3 3 3 1,B是3 3 3 4,这个时候还能随意取吗?显然不能,因为A中的第四个元素是1,小于B中第四个元素4。所以应该先取A中的3,也就是说当A和B头部的元素相等的时候,我们应该继续往后比较,直到出现元素不同的情况为止,然后我们选择较小的那个。

这段代码并不难写:

import sys


n = int(input())

A = list(map(int, input().split(' ')))
B = list(map(int, input().split(' ')))

# 插入无穷大,作为标兵,防止超界
A.append(sys.maxsize)
B.append(sys.maxsize)

C = []

ida, idb = 0, 0

for i in range(2*n):
    if A[ida] < B[idb]:
        C.append(A[ida])
        ida += 1
    elif A[ida] > B[idb]:
        C.append(B[idb])
        idb += 1
    else:
        # 如果相等往后比较
        ca, cb = ida+1, idb+1
        while A[ca] == B[cb] and ca <= n and cb <= n:
            ca += 1
            cb += 1
        if A[ca] < B[cb]:
            C.append(A[ida])
            ida += 1
        else:
            C.append(B[idb])
            idb += 1


for i in C:
    print(i, end=' ')

今日问题

不确定抽奖问题。

抽奖我们都很熟悉,比如年会抽奖,一共100个员工,抽10个人中奖。这个情况很容易解决,因为抽奖人数和中奖数都是确定的,我们只需要用随机数很容易解决。但假设我们是公开抽奖,谁都可以参与,事先不知道参与人数,只确定中奖数,我们应该怎么设计其中的算法呢?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 每日一题 | 两个序列归并问题
  • 今日问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档