poj 1218(经典开关问题,模拟)
经典开关问题:
大概意思如下:一个监狱看守员喝醉了酒,于是把监狱每扇门都打开(假设有n扇门);然后再从1号门开始,隔一扇关一个门(把2的倍数的门关掉);接着再从1号门开始,隔2扇操作一个门(操作3的倍数的门,原来是开的关掉,关着的则打开)。这样一直操作到n的倍数,问最后有多少扇门是打开的。
这个也可以叫关灯问题:有n个灯,分别由n个开关控制,拨一下开关则可以改变灯的状态(开->关 关->开)。初始状态灯都是关着的,先把每个开关都拨一下,然后拨一下2的倍数的开关,接着3的倍数,直到n的倍数,问最后有多少灯是开着的。
模拟:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int main() 6 { 7 int T; 8 cin>>T; 9 while(T--) 10 { 11 int n; 12 int i,j; 13 cin>>n; 14 int a[117]; 15 memset(a,0,sizeof(a)); 16 for(i=1; i<=n; i++) 17 { 18 for(j=1;j<=n;j++) 19 { 20 if(j%i==0)a[j]=!a[j];// 每一次都取相反状态 21 } 22 } 23 int k=0; 24 for(i=1;i<=n;i++) 25 { 26 if(a[i]!=0)k++;//如果不等于0,则说明灯开着 27 } 28 cout<<k<<endl; 29 } 30 return 0; 31 }