开灯问题---引《算法竞赛入门经典》
很经典的模拟题,入门者经常在这样的问题卡主,所以觉得很好的一题,贴上code:
/*
开灯问题 ------约瑟夫问题(原理一样的)----模拟算法
思路:n盏灯,k个人,所以只能从1---k,而灯1---n,
里面的规律是:第 m个人,其倍数都是置反的,所以利用从1----n,如果能整出m,
说明这个人会将灯的状态置反
*/
#include <cstdio>
#include <cstring>
#define maxn 1010
int a[maxn];
int main(){
int n,k,first = 1;//用来处理第一个元素的
memset(a,0,sizeof(a));
scanf("%d %d",&n,&k);
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
if(j % i == 0) a[j] = !a[j];
for(int j=1;j<=n;j++)
if(a[j]){
if(first)
first = 0;
else
printf(" ");
printf("%d",j);
}
printf("\n");
return 0;
}
可以通过这种思路去解决约瑟夫问题
浙公网安备 33010602011771号