Skip to content

14010: 【原4010】谁最有耐心

题目

题目描述

author: yura 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4010

Description

终于放假了!!!作为一个热血青年,丁姐决定在假期去幼儿园做老师。

幼儿园最近很流行一种报数游戏:n个小朋友围成一圈报数,他们有各自的编号:1,2,3...n,从第一个小朋友开始依次报数。但是小朋友们不太有耐心,第i个小朋友的耐心值为Ai(Ai>1),当他第Ai次报数以后,他就会失去耐心退出游戏;同时,他会很生气地反过来报数,以干扰其他小朋友玩游戏(例如,原来的报数顺序为顺时针,现在改为逆时针)。在其他小朋友都退出游戏以后,剩下的那一个就是最有耐心的小朋友。

丁姐想知道,最有耐心的小朋友是哪一个?

Input Format

第一行一个整数n

第二到第n+1行每行一个整数Ai,代表编号为i的小朋友的耐心值

30%数据: \(1 \leq n \leq 10 , 2 \leq Ai \leq 10 \)

80%数据: \(1 \leq n \leq 100 , 2 \leq Ai \leq 1000 \)

100%数据: \(1 \leq n \leq 1000 , 2 \leq Ai \leq 10^{6} \)

Output Format

最有耐心的小朋友的编号

Sample Input

3
4
3
3

Sample Output

3

Limits

时间限制:1000ms

zqy2018's solution

#include <bits/stdc++.h>
#define INF 2000000000
#define MOD 1000000007
#define MAXN 200005
#define REP(temp, init_val, end_val) for (int temp = init_val; temp <= end_val; ++temp)
#define REPR(temp, init_val, end_val) for (int temp = init_val; temp >= end_val; --temp)
using namespace std;
int read(){
    int f = 1, x = 0;
    char c = getchar();
    while (c < '0' || c > '9'){if(c == '-') f = -f; c = getchar();}
    while (c >= '0' && c <= '9')x = x * 10 + c - '0', c = getchar();
    return f * x; 
}
int n, a[1005], l[1005], r[1005];
void init(){
    n = read();
    REP(i, 1, n)
        l[i] = i - 1, r[i] = i + 1,
        a[i] = read();
    l[1] = n, r[n] = 1;
}
void solve(){
    int curdir = 1, cur = 1;
    REP(T, 1, n - 1){
        int mini = INF, tmp = cur;
        do{
            mini = min(mini, a[tmp]);
            tmp = (curdir ? r[tmp]: l[tmp]);
        }while (tmp != cur);
        do{
            a[tmp] -= mini - 1;
            tmp = (curdir ? r[tmp]: l[tmp]);
        }while (tmp != cur);
        for (; ; ){
            --a[cur];
            if (!a[cur]){
                if (curdir){
                    int to = l[cur];
                    r[to] = r[cur], l[r[cur]] = to;
                    cur = to;
                }else {
                    int to = r[cur];
                    l[to] = l[cur], r[l[cur]] = to;
                    cur = to;
                }
                curdir ^= 1;
                break;
            }
            cur = (curdir ? r[cur]: l[cur]);
        }
    }
    printf("%d\n", cur);
}
int main(){
    init();
    solve();
    return 0;
}