开灯问题---引《算法竞赛入门经典》

很经典的模拟题,入门者经常在这样的问题卡主,所以觉得很好的一题,贴上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;
} 

  可以通过这种思路去解决约瑟夫问题

posted on 2014-12-02 19:09  lzm420241  阅读(256)  评论(0)    收藏  举报

导航