2019 East Central North America
题意:
一些人各自选一个数,从第一个人开始计数,达到第一个人所报的数停止,当前报到数的那个人淘汰,再从淘汰的人的下一个人开始,报他所选的数,以此类推,知道最后只剩下一个人
思路:
类约瑟夫环问题,也叫猴子选大王问题,变化就是原本的猴子选大王所报的数是固定的,本题是变化的,我们可以存一个二维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; }

浙公网安备 33010602011771号