题意:
给出一个 非负串 求最大k值 使得k对任意i j 满足 k⋅|i−j|≤min(ai,aj)
显然k<= min(ai,aj)/|i-j|
一开始做的时候 选了一个最大值 然后遍历数列 显然最大值和其他任意值相比min都是其他值 然后更新答案 但是正确性显然有问题。。。 因为这个wa了3次
然后发现应该和最左端和最右端相比较 更新答案
ac:
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f #define lson l,m,pos<<1 #define rson m+1,r,pos<<1|1 const int N=400000+5; int a[N]; struct node { int v,pos; }s[N]; bool cmp(node a,node b) { return a.v<b.v; } int main() { int n;RI(n); int ans=1e9+5; rep(i,1,n) { RI(s[i].v);s[i].pos=i; } sort(s+1,s+1+n,cmp); rep(i,1,n) { if(s[i].pos!=1) ans=min(ans,s[i].v/(s[i].pos-1) ); if(s[i].pos!=n) ans=min(ans,s[i].v/(n-s[i].pos)); } cout<<ans; return 0; }
官方题解:
其实根本不需要排序什么的
直接比就行了
#include <bits/stdc++.h> using namespace std; const int M = 1e5; int n, a, m = 1e9; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 0; i < n; i++) { cin >> a; m = min(m, a / max(i, n - 1 - i)); } cout << m; return 0; }