无聊的服务员(重复关门)

来源:互联网 发布:中国中车株洲所知乎 编辑:程序博客网 时间:2024/04/30 21:56

现有一个酒店有n个房间,依次编号为1到n,第一个服务员经过,将所有房间门打开;第二个服务员经过将所有编号为2的倍数的房门打开的关上,关闭的打开;第三个服务员经过将所有编号为3倍数的房门打开的关上,关闭的打开。依此类推;
原先我的思路是这样的:

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a[110]={},s=0;
cin>>n>>m;
for(int i=1;i<=m;i++)     //人数
{
  if(i%2!=0)      //判断这个人是关门还是开门,此时为开门(但题目思路这样是错的)
  {
for(int j=1;j<=n;j++)
 if(j%i==0)a[j]=1;       //如果门号是这个人的倍数,则门开着
  }
  else 
  {
  for(int k=1;k<=n;k++)
  if(k%i==0)a[k]=0;    //如果门号是这关门人的倍数,则门关着  
  }
}
for(int i=1;i<=n;i++)
   if(a[i]==1)s++;   //统计开着门的数量
cout<<s<<endl;
return 0;
}


后来和大姐头(俺姐们儿)争执了一番我一直没让她说话,最后她一语惊醒我:有的门是两个数的倍数,关了还要开,开的还要关的呀。
 不用说,顿时就尴尬了......


#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a[110],s=0;
cin>>n>>m;
    for(int i=1;i<=n;i++)
     a[i]=-1;             //把每道门设为关上的
    for(int i=1;i<=m;i++)//枚举人
 for(int j=1;j<=n;j++) //内套门
   if(j%i==0)a[j]=-a[j]; //是人的倍数关上的就开开的就关(注意)
for(int i=1;i<=n;i++)
if(a[i]==1)s++;//如果是开的就累加最后输出
cout<<s<<endl;
return 0;
}


虽然是简单的题目但错就是错了,只有积小步成大步,才会有所进步!