题目大意:
圆形球场有n个门,Allen想要进去看比赛。Allen采取以下方案进入球场:开始Allen站在第一个门,如果当前门前面有人Allen会花费单位时间走到下一个门,如果没人Allen从这个门就进去了。球场的每个门,每单位时间可以进去一个人。问Allen最终是从哪个门进入球场的?
题解:
如果是直接模拟的话,极限是数据是1e5个点,且值都是1e9,这样就算模拟是O(n)的也会T掉,所以直接模拟不可以。
经过第i个门的时间是i,i+n,i+2n......i+kn,当第一次i+kn>a[i]时,这个i+kn就是如果Allen要从第i个门进入需要多少时间,对于每个门,计算出这个i+kn,然后取所有门的最小值就是答案
#include<bits/stdc++.h>
#include<cstring>
#define ll unsigned long long
using namespace std;
int a[100010];
ll b[100010];
#define INF 1000000000000000000
int main()
{
int n;
scanf("%d",&n);
int t;
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
t=a[i]/n;
b[i]=((i+t*n>a[i])?(i+t*n):(i+(t+1)*n));
}
ll ans=INF;
int pos=0;
for(int i=1;i<=n;++i)
if(ans>b[i])
{
ans=b[i];
pos=i;
}
cout<<pos<<endl;
return 0;
}