标题是二传
正反建图,正图使从 1 出发到每个点 min[w] 最小,反图使从 n 出发到每个点 max[w] 最大
枚举转移点 u
为什么用 dij ?
dij 可以求出 1 到此点经过的点的最小值
给定正整数序列 ,求一个平均数最大的 \(A\),长度不小于 \(L\) 的(连续的)子段。
看看代码吧,就是不会
#include <bits/stdc++.h>
using namespace std;
const double eps=1e-5;
int n,L;
double a[100005],b[100005];
bool check(double mid){
double minn=9982443530;
for(int i=1;i<=n;i++)b[i]=a[i]*1.0-mid;
// for(int i=1;i<=n;i++) cout<<b[i]<<" ";
// cout<<endl;
for(int i=1;i<=n;i++)b[i]=b[i-1]+b[i];
for(int i=L;i<=n;i++){
minn=min(b[i-L],minn);
if(b[i]-minn>=-eps)return 1;
}
return 0;
}
int main(){
cin>>n>>L;
for(int i=1;i<=n;i++){
cin>>a[i];
}
double l=-1e6,r=1e6;
while(l+eps<r){
double mid=(l+r)/2.0;
if(check(mid))l=mid;
else r=mid;
}
cout<<int(r*1000);
return 0;
}