18441 偷懒的士兵

我不是女神ヾ 2023-02-14 05:53 52阅读 0赞

时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题 语言: G++;GCC;VC
Description
有N个士兵站成一队列, 现在需要选择几个士兵派去侦察。
为了选择合适的士兵, 多次进行如下操作: 如果队列超过三个士兵, 那么去除掉所有站立位置为奇数的士兵,
或者是去除掉所有站立位置为偶数的士兵。直到不超过三个战士,他们将被送去侦察。现有一个“聪明”的士兵,
经常通过选择站在合适的初始位置,成功避免被选中去侦察。这引起了陈教官的注意。陈教官希望你编写一个程序,
当给定士兵数之后,输出有多少个位置上的士兵是不可能被选中去巡逻的。

注: 按上法得到少于三士兵的情况不用去巡逻。

1 <= N <= 21亿

输入格式
有多行(可能有上百行,请尽量优化代码),每行一个数字N,最后一行是0

输出格式
对每一行的数字N,不可能被选中去巡逻的位置数

直到没有数字

输入样例
10
6
0

输出样例
4
0

作者 admin
解题思路:由巡逻的士兵递归的结束条件修改一下即可。

  1. #include<iostream>
  2. using namespace std;
  3. int v[1000002];
  4. int f(int n)
  5. {
  6. if(n==3)
  7. return v[n]=0;
  8. if(n<3)
  9. return v[n]=n;
  10. if(n<=1000000&&v[n]==0)
  11. {
  12. return v[n]=f(n/2)+f((n+1)/2);
  13. }
  14. else if(n<=1000000&&v[n]!=0)
  15. return v[n];
  16. else if(n>1000000)
  17. return f(n/2)+f((n+1)/2);
  18. }
  19. int main()
  20. {
  21. int n;
  22. while(cin>>n&&n)
  23. {
  24. cout<<f(n)<<endl;
  25. }
  26. return 0;
  27. }

发表评论

表情:
评论列表 (有 0 条评论,52人围观)

还没有评论,来说两句吧...

相关阅读

    相关 偷懒

       偷懒真是恐怖,一不小心就两天过去了。    昨天,电脑风貌不转了,想着能登网页,看看漫画就凑活着用吧!后来cpu温度飙升到80多度,360提醒了一次,无视之, 最后可

    相关 偷懒程序员

    在我们的印象里,偷懒无疑是个贬义词,往往是家长形容孩子不爱学习,不爱干家务活;领导形容员工不尽责,爱开小差;...但是今天我们要把偷懒当做个褒义词来用,大家想想看,我们现在社会

    相关 偷懒程序员

    在我们的印象里,偷懒无疑是个贬义词,往往是家长形容孩子不爱学习,不爱干家务活;领导形容员工不尽责,爱开小差;...但是今天我们要把偷懒当做个褒义词来用,大家想想看,我们现在社会