题目链接
题目大意
给你一个大小为n的数组,确定最大的 k 满足任意的i,j(1<=i,j<=n)k⋅|i−j| ≤ min(ai,aj);
解题思路
比赛的时候感觉跟一只智障一样。。。。怎么也没想出来,一直在想对于一个数找他左边最远的比它大的和右边最远比它大的。。。。。事实证明我还是太年轻
下面是正解:
对于一个数来说,我们只需要考虑他的最坏情况
对于一个数字如果他在前n/2,那么离他最远的就是位于n的那个位置, 如果他位于后面的n/2的位置,那么离他最远的就是位于1的那个位置,我们假设这个x和离他最远的位置上的数相比较而言是比较小的那个,那么我们直接计算k的值就好了,如果它不是比价小的那个,那么后面我们一定会计算出一个更小的k的值去更新它
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int n,x;
int ans=0x3f3f3f3f;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(i<=n/2)
{
ans=min(ans,x/(n-i));
}
else
{
ans=min(ans,x/(i-1));
}
}
printf("%d\n",ans);
return 0;
}