2019 East Central North America

F.Musical Chairs

题意:

一些人各自选一个数,从第一个人开始计数,达到第一个人所报的数停止,当前报到数的那个人淘汰,再从淘汰的人的下一个人开始,报他所选的数,以此类推,知道最后只剩下一个人

思路:

类约瑟夫环问题,也叫猴子选大王问题,变化就是原本的猴子选大王所报的数是固定的,本题是变化的,我们可以存一个二维pair的vector,同时存他的下标和值(报的数),

本题用到了vector中的erase,用法是v.erase(v.begin() + pos),pos是要删除的位置,所以关键点就在于求出pos是多少

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

using namespace std;

typedef long long LL;
typedef pair<int, int>PII;

int n;
vector<PII>v;

int main()
{
    cin >> n;
    for(int i = 0 ; i < n ; i ++ )
    {
        int x;
        cin >> x;
        v.push_back({i + 1, x});
    }
    //不是v[0].first,因为在vector中下标从0开始
    int pos = 0, val = v[0].second;
    while(v.size() > 1)
    {
        pos = (pos + val - 1) % n;//淘汰的人的位置
        val = v[(pos + 1) % n].second;//淘汰的人的下一个人报的数
        v.erase(v.begin() + pos);//淘汰的人
        n -- ;//淘汰之后总数减一
    }
    cout << v[0].first << endl;
    
    return 0;
}

 

posted @ 2021-07-24 11:14  彦辰kkkkk  阅读(49)  评论(0)    收藏  举报