【编程题】【未知出处】克隆排队

题目来自于https://blog.csdn.net/song2016/article/details/81187109

以下记录想法与python核心代码

 

题目1:

Alice、Bob、Cathy、Dave四个人排队喝可乐,喝完一个人变两个,接着继续到队尾排队,问第N个人喝可乐的人是谁

如:N=8: ABCDAABB,第八个人是B,

分析:

i = 0    people = 4
i = 1    people = 4 + 4*2
i = 2    people = 4 + 4*2 + 4*2*2
I = n    people = 4 + 4*2 + .. + 4*(2**n) 
         = 4*(2**0 + 2**1 + .. + 2**n) = 4*(2**n - 1) # 利用等比数列求和公式得到
i = 0
while 4 * (2**i - 1) < n:
    i += 1 
cut = (n - 4 * (2**(I-1) - 1)) / 2**(I) 即得到ID

 

题目2:

N个球星,M个人评级,共a-z 26个级别,a最高,z最低,球星X比球星Y评级高,则认为球星X强于球星Y,所有一个球星强于其他所哟球星,则认为其为球王。问谁能得到球王称号

例1:N=4,M=3,评价为acbd,bacd,bdca,输出为0;

例2:N=3,M=3,评价为abc,bca,cab,输出为-1.

分析:

这个题把所有的求和级别转成数字加起来直接比较能有70%,后来在牛客网上看到一个讨论觉得很有道理,不应该用总和来求,应该用字母的优先级来求即如下例子:

输入为N=2,M=3,评价为:aa,ba,bc,输出应该为1,因为这里是abb,aac,虽然总数一样,但是应该是1强于0的
 

解决方案:

1. 使用数字加和,但要求a-z每三个相邻字母的赋值都要满足a=b+c+1,即可避免上述情况

2.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值