列表

详情


NC223614. FMusicalChairs

描述

Professor O’Dagio of the music department at Faber College has come up with a rather interesting way of selecting its department chair. All n members of the music faculty line up, then the first one in line calls out an integer k corresponding to the opus number of his or her favorite musical composition by Faber College’s most illustrious alumnus, composer I. M. Tondeff. The department members then “count off,” starting with the first in line and cycling back to the beginning of the line if necessary. When the count reaches k, that person steps out of the line and is relieved (in more than one sense!) of chairmanship duty for that year. 
The next person in line then calls out his or her favorite opus number (this becomes the new value of k) and the count restarts at “1,” and continues until the next person is eliminated, and so on. When only one faculty member is left standing, this is the new department chair. To prevent cheating, everyone’s favorite number is announced in advance and no one is allowed to choose Tondeff’s Opus 1 (the famous drinking song Rhapsody in Brew). 
For instance, suppose the professors are numbered 1 through 4 and lined up in that order; suppose their favorite opus numbers are, respectively, opus 8 (The Four Sneezings), opus 2 (Concerto for Kazoo and Cigar Box Banjo), opus 4 (The Taekwondo Rondo), and opus 2 (again). Figure F.1 shows the process by which the new chair is selected.

Figure F.1: Example of Selection Process

输入描述

The first line of input contains an integer n (2 ≤ n ≤ 104 ), the number of faculty members. The next line contains n integers k1 . . . kn (2 ≤ ki ≤ 106 for each i), where ki is the favorite opus number of professor i.

输出描述

Output the number of the new department chair.

示例1

输入:

4
8 2 4 2

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 587ms, 内存消耗: 7400K, 提交时间: 2021-07-22 16:25:20

n = int(input())
proferess=input().split()
for x in range(n):
    proferess[x]=(int(proferess[x]),x+1)
while True:
    if len(proferess)==1:
        print(proferess[0][1])
        break
    m=proferess[0][0]
    js=m%len(proferess)
    if js==0:
        proferess=proferess[:-1]
    else:
        proferess=proferess[js:]+proferess[:js-1]

C++ 解法, 执行用时: 27ms, 内存消耗: 620K, 提交时间: 2022-01-28 15:09:57

#include<bits/stdc++.h>
using namespace std;
vector<pair<int, int>>v;
int n, k;
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		cin >> k;
		v.push_back({k,i});
	}
	for(int x = n, s = 0, y; x > 1; s = y % --x)
	{
		y = (s + v[s].first - 1) % x;
		v.erase(v.begin()+y);
	}
	cout << v[0].second;
}

上一题