三个点超时,求大佬指导
  • 板块P1145 约瑟夫
  • 楼主王鸿翼
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/9/16 21:36
  • 上次更新2023/11/4 06:36:18
查看原帖
三个点超时,求大佬指导
75821
王鸿翼楼主2021/9/16 21:36
#include<bits/stdc++.h>
using namespace std;
int k;
int a[29];//表示第i个人的状态 0是活,1是死 
bool dfs(int kk){
	int sum=0;//杀死的人数 
	int s=0;//s表示当前报数的人的编号 
	memset(a,0,sizeof(a));//初始化 
	for(int i=1;i<=2*k;i++){//模拟报数 
		if(sum==k)	break;//杀完则返回 
		if(!a[i])	s++;//如果第i号是活的,则可以报数 
		if(s==kk){//当报数的人与上一个杀死的人间隔kk时,判断好坏 
			s=0;
			if(i<=k&&sum<k)	return false; //sum<k说明坏人没杀完,而此时i<=k则说明现在要杀的是好人 
			else{
				if(i>k)	sum++;//如果此时杀的是坏人,计数器+1 
				a[i]=1;//已杀死 
			}	
		}
		if(i==2*k)	i=0;//如果循环到最后一个人,则从头开始 
	}
	return true;
}
int main(){
	cin>>k;
	for(int i=1;i;i++){
		if(dfs(i)){
			cout<<i;
			break;	
		}

	}
	return 0;
}
//复杂度O(n^2) 
2021/9/16 21:36
加载中...