首页 > 其他 > 详细

OI养老专题03:让坏人出列的约瑟夫问题

时间:2019-04-23 21:03:04      阅读:140      评论:0      收藏:0      [点我收藏+]

  问题是这样的:一共有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;
}

  而且是那种直接交输出文件的打表程序(滑稽)

 

OI养老专题03:让坏人出列的约瑟夫问题

原文:https://www.cnblogs.com/akura/p/10758859.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!