P1996 约瑟夫问题

P1996 约瑟夫问题

AC1

数据量少,暴力模拟 12ms

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;

int main(){
    vector<int> ans;
    int personnum,number;
    scanf("%d%d",&personnum,&number);
    int nums[100];
    for (int i = 0; i < personnum; ++i) {
        nums[i]=i+1;
    }
    int flag = 0;
    int sum = 0;
    for (int j = 0; j < personnum; ++j) {
        if(nums[j]==0&&j==personnum-1){
            j=-1;
            continue;
        }
        if(nums[j]!=0&&j==personnum-1){
            flag++;
            if(flag%number==0){
                cout<<nums[j]<<" ";
                nums[j]=0;
                flag = 0;
                sum++;
            }
            j=-1;
            continue;
        }
        if(nums[j]==0)
            continue;
        flag++;
        if(flag%number==0){
            cout<<nums[j]<<" ";
            nums[j]=0;
            flag = 0;
            sum++;
        }
        if(sum==personnum)
            break;
    }
    return  0;
}

AC2 使用循环链表

也是12ms。。。

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <list>

using namespace std;
int main() {
    list<int> persons;
    int personnum, number;
    scanf("%d%d", &personnum, &number);
    for (int i = 0; i < personnum; ++i)
        persons.push_back(i + 1);
    int target = 0;
    for (list<int>::iterator it = persons.begin(); it != persons.end();) {
        target++;
        if (target == number) {
            cout << *it << " ";
            it = persons.erase(it);//这步易错
            target = 0;
        } else it++;
        if (it == persons.end())
            it = persons.begin();
        cout << (persons.begin() == persons.end());
        //3 6 9 2 7 1 8 5 10 4
    }
    return 0;
}
原文地址:https://www.cnblogs.com/sunqiangstyle/p/10312270.html