问题是这样的:一共有2n个人,其中有n个好人,n个坏人。好人的编号是1~n,坏人的编号是n+1~2n。要求你求出最小的m(报数到m的人出局),让前n个出局的人都是坏人。
似乎除了暴力,我们想不出其它的什么办法来。而这题的数据范围......n<14!!!!!!!那就直接暴力好了(滑稽)
for(int i=1;i<=n;i++){ ans[i]=(ans[i-1]+m-1)%(2*n-i+1); if(ans[i]<n) i=0,m++; } printf(",%d",m);
鬼知道它的复杂度是多少......不过就算是O(N3)也是可以过的,这题就给我们水过去了。
不过,这是正解吗?你看这个范围只有14,题目的变量也只有一个,这不是大喊着让我们打表过吗?所以为了rank,我打了个表......
#include<stdio.h> #include<string.h> int main(){ //freopen("poj1012 约瑟夫问题2.txt","w",stdout); puts("#include<iostream>"); puts("using namespace std;"); printf("int ans[15]={0,2"); int ans[20]; for(int n=2;n<14;n++){ int m=1; memset(ans,0,sizeof ans); for(int i=1;i<=n;i++){ ans[i]=(ans[i-1]+m-1)%(2*n-i+1); if(ans[i]<n) i=0,m++; } printf(",%d",m); } printf("};\n"); puts("int main(){"); puts(" int n;"); puts(" cin>>n;"); puts(" cout<<ans[n];"); puts(" return 0;"); puts("}"); return 0; }
而且是那种直接交输出文件的打表程序(滑稽)