算法与数据结构实验题 2.2 幸运儿

算法与数据结构实验题 2.2 幸运儿
★实验任务
泡泡最近下了个饱了吗 app,这个 app 推出了个坑蒙拐骗的红包系统,只要花一块钱买张一元抵用券,就有参与 20 元红包的抽奖机会,抽奖界面会实时显示当前参与抽奖的人数,当参与抽奖人数达到 n 的时候,开奖一次,抽取一名幸运儿获得 20 元红包。
一次偶然的机会,机智的泡泡偷瞄到了生成幸运儿的源码:每当有人参与抽奖,这个人就进入队列。
开奖时,每轮淘汰一个人,直到剩下一个人:每轮从第一个人开始,从 1 开始报数。
1. 如果当前的人报的数不超过队列人数的一半,那么这个人出队,回到队尾等待下一次报数,下一个人继续报下一个数。
2. 如果当前的人报的数超过了队列人数的一半,那么这个人出局,即未中奖。这一轮结束,下一轮就从紧接着的下一个人开始重新开始报数。
显然最后会只剩下一个人,这个人就是幸运儿啦~
机智的泡泡马上意识到,当 n 已知的时候,幸运儿其实可以预知到是第几个
参与抽奖的人。
机智的泡泡马上又意识到,假设第 x 个参与抽奖的人是幸运儿,那么只要看到屏幕上显示的人数达到 x-1 的时候参与抽奖,就能成为那个幸运儿啦~
机智的泡泡马上从小道消息得知了 n,正试图预知出 x 的值。
机智的泡泡马上把锅甩给了你。
★数据输入
输入第一行为一个正整数 n。
对于 50%的数据,1<=n<=1000;
对于 80%的数据,1<=n<=6000;
对于 100%的数据,1<=n<=1000000000;
★数据输出
输出 x。
输入示例
5
输出示例
5

输入示例
6
输出示例
3


思路:
在草稿纸上多演算几次就可以发现当n是奇数时输出n,偶数是输出n/2。。。2333
但是这样有些不严谨
那么,用逻辑来推一遍
题目要求,报数超过队列的一半时出列。那么分情况来讨论:
当n是偶数时,将队列分成长度相等的前后两个子队列,可以观察到,每次出队的都是这两个子队列的队头,最后剩下来的一定是前子队列的队尾,故答案是n/2;
当n是奇数时,将队列分成三段,长度分别为(n-1)/2,1,(n-1)/2,可以观察到,首先出队的是中段队列的那一个数,将这一个数出队后,剩下的队列就可以当成n是偶数时来处理,最后剩下的一定是后段队列的队尾,故答案是n。
附上代码

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n%2==0) printf("%d",n/2); 
    else printf("%d",n); 
    return 0;
}

时间复杂度为O(1)。
为了进一步节约时间,代码第六行的n/2可以用n>>1来代替,>>是移位操作符,具体使用方式可以自行百度。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值