UOJ Logo sharpland的博客

博客

[P82讨论帖] 【P82解题讨论】新讨论

2020-12-26 17:05:46 By sharpland

猴子选大王题解:

猴子大王是最后剩余两只猴子中选,我们需要模拟猴子退出的过程。

开一个bool 数组 a[1010] 来标记猴子是否退出。 我们要开一个计数器来记录 mark来记录当前还有多少只猴子。

    cin>>n;
    mark=n;
    for(int i=1;i<=1010;i++) a[i]=true;

然后模拟整个过程即可。

具体模拟时,我们开一个计数器来记录是第几次开始重新找,如果次数为奇数,就从头到尾找要退出的猴子,如果为偶数就是从尾到头找要退出的猴子

具体代码:

    while(mark>2)
    {
       if(j%2) counta();
       else countb();
       j++;
    }

counta 为从头到尾找要退出的猴子:

void counta()
{
    int i=1,k=0;
    for(int i=1;i<=n;i++)
    if(a[i]) if(++k==3) { a[i]=false; k=0; mark--;}
}

countb 只需要改一下循环的顺序即可。

最后 while(mark>2) 循环结束后,表明现在只有两只猴子

  if(j%2)  从1到n找第一个没退出的猴子
  else     从n到1找第一个没退出的猴子

输出即可。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。