用暴力超时了……最后找了别人的代码,AC了…… 别人的代码: #include <stdio.h>bool JS(int k,int m) { //判断以 m 报数是否满足条件 int i=0; int len=2*k; while (len>k) { //最多报数len次 i=(i+m-1)%len; //当i=0时,计算出的i为以m报数第一个出队的坏人的编号 if (i<k) return 0; len--; } return 1;}int GetNum(int k) { // 枚举 (k+1)的倍数 或 (k+1)的倍数加 1 int i=k+1; while (1) { if(JS(k,i)) return i; if(JS(k,i+1)) return i+1; i+=(k+1); }}int main(){ int i,n; int f[14]; //将所有的可能值枚举到数组 x 里 for(i=1;i<14;i++) f[i]=GetNum(i); while(scanf("%d",&n),n) printf("%d/n",f[n]);} 超时代码……不解释 #include<iostream>#include <stdio.h>using namespace std;int ans[111];int main(){ int n,m; int i,p; while(scanf("%d",&n),n) { for(p=n+1; ;p+=( p%n==2?n+1:1 ) ) { int cnt,pt; int N=2*n; //有N个人 n个好人,n个坏人 for(i=0;i<=2*n;i++) ans[i]=i; cnt=n; pt=0; i=1; while(cnt){ while(i<p){ pt=(pt+1)%N; if(ans[pt]!=-1) i++; } // printf("%d ",pt+1); if(pt<n) break; ans[pt]=-1; i=0;cnt--; } if(cnt==0) break; } printf("%d/n",p); } }