标题:约瑟夫环:只去掉所有坏人的问题。
只看楼主
粉jj
Rank: 2
等 级:论坛游民
威 望:1
帖 子:123
专家分:82
注 册:2011-3-8
结帖率:85.11%
已结贴  问题点数:20 回复次数:2 
约瑟夫环:只去掉所有坏人的问题。
有n个人围坐在一个圆桌周围,把这n个人依次编号为1,…,n。从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,…,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。现在的问题是:假设有k个好人和k个坏人。好人的编号的1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人


#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int k,m;
int first,flag;
int check(int mm)
{
    int ans=(first+m-1)%mm;    //杀死的人 去摸防止溢出
    if(ans>=k)                 //大于k说明坏人被杀死了满足答案
    {
        first=ans;
        return 1;
     }
     return 0;                //好人被杀,不行,不是我们的答案
 }
int main()
{
    cin>>k;
    m=k;
    while(flag==0)
    {
        flag=1,first=0;       //找到答案的标记
        for(int i=0;i<k;i++)  //枚举
        {
            if(check(2*k-i)==0)
            {
                flag=0;
                break;
            }
        }
        m++;//答案会多算
    }
    cout<<m-1<<endl;
    return 0;
}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int ans=(first+m-1)%mm;    这里为什么要first+m-1?
    if(ans>=k)             这里不能只>k吗??
搜索更多相关主题的帖子: include int 出列 编号 first 
2023-04-11 12:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
(first+m-1)%mm 中「减一」是为了从「从1计数」换为「从0计数」
if(ans>=k) 中「不用>」是因为ans是「从0计数」的
根本原因是:「从0计数」才是科学的
2023-04-11 15:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
算法没改,只是把天书般的代码理一理

程序代码:
#include <iostream>
using namespace std;

bool check( size_t k, size_t m )
{
    for( size_t i=0, first=0; i!=k; ++i )
    {
        first = (first+m)%(2*k-i);
        if( first < k )
            return false;
    }
    return true;
}

int main( void )
{
    size_t k;
    cin >> k;

    for( size_t m=k; ; ++m )
    {
        if( check(k,m) )
        {
            cout << m+1 << endl;
            break;
        }
    }
}
2023-04-11 16:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511868-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016424 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved