一、题目
1、原题链接
2、题目描述
二、解题报告
1、思路分析
思路参考y总:y总讲解视频
(1)直接模拟会超时,需要进行优化。
(2)由于数列中的数都为非负数,所以我们可以找出数列中的最小数。因为只有在执行最小数的步数后,数列中才可能出现0。
(3)然后从执行完最小数的步数后开始模拟,这样至多执行一圈就会结束,不会超时。
(4)按照上述思路模拟,输出答案即可,注意取模、以及数组下标与题目中下标的差异问题。
2、时间复杂度
时间复杂度为O(n)
3、代码详解
#include <iostream>
using namespace std;
const int N = 100010 , INF = 2e9;
int a[N];
int n;
int main() {
cin >> n;
int min = INF; //min记录最少走多少步后数组中出现0
for (int i = 0; i < n; i++) {
cin >> a[i];
if (a[i] < min) min = a[i];
}
//走min步后到达的位置为min%n,此时的该位置的值为减去min后的结果
//以后每多走一步,后面位置的数都要多减一次1
while (a[min % n] - min > 0) min++;
//最后走min步结束,到达位置为min%n(下标从0开始运动)
//因为题目中从下标1开始运动,所以需要加1
cout << min % n + 1;
return 0;
}