在UOJ的第一页,我只有一道尘封了100 年的题,至今未 AC原因只是一个小小的错误
题目:
n只猴子选大王,选举办法如下:从头到尾1,2,3报数,凡报3的退出,余下猴子第二轮从尾到头1,2,3报数,凡报3的退出...如此类推,当剩下两只猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?
一道很纯朴的代码片:
至于讲解注释里面都有吧
#include<bits/stdc++.h>
using namespace std;
bool a[1000];
int main()
{
int n;
cin>>n;
for (int i=0;i<1000;i++)
a[i]=true;//判断猴子是否被踢出队伍
bool k=true;//是否逆序
int x=n;
int count=0;//计数器
while (n>2)
{
count=0;
if (k)//顺序报数
for (int i=0;i<x;i++)
{
if (a[i])//没被踢出队伍
{
count++;//报数
if (count==3)//报到3
{
count=0;//归零
a[i]=false;//踢出队伍
n--;//队伍少一人
if (n==2) break;//只剩两猴
}
}
}
else
for (int i=x-1;i>=0;i--)//逆序报数
{
if (a[i])//没被踢出队伍
{
count++;//报数
if (count==3)//报到3
{
count=0;//归零
a[i]=false;//踢出队伍
n--;//队伍少一人
if (n==2) break;//只剩两猴
}
}
}
if (k)
k=false;//顺序变逆序
else
k=true;//逆序变顺序
}
return 0;
}
以前在Pascal上做过,第一次码的很快,满心欢喜地运行,带来的却是无输出
有一些数能输出,可都是错误答案
于是开始了漫长的搜索之旅……
终于,我发现了一个很小很小的错误
是很小,应该算是低级错误,其实也不用说的那么惊天动地的
首先是这个错误代码
原因是if后面没有用大括号拦截,程序自动把最近的else连在一起了
而不是和if(k)连在一起!
if (k)
for (int i=0;i<x;i++)
if (a[i])//找到第一个报数的猴子 注意!
{
cout<<i+1<<endl;//输出
return 0;//结束
}
else //注意!
for (int i=x-1;i>=0;i--)
if (a[i])//找到第一个报数的猴子
{
cout<<i+1<<endl;//输出
return 0;//结束
}
添上就能AC了
if (k)
for (int i=0;i<x;i++)
{
if (a[i])//找到第一个报数的猴子 注意!
{
cout<<i+1<<endl;//输出
return 0;//结束
}
}
else //注意!
for (int i=x-1;i>=0;i--)
if (a[i])//找到第一个报数的猴子
{
cout<<i+1<<endl;//输出
return 0;//结束
}
博客结束