现有一个酒店有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;
}
虽然是简单的题目但错就是错了,只有积小步成大步,才会有所进步!