AK选手前来补充一发邪典(水数据)写法
题面:
简单来说就是给你一个序列,让你选择一段连续区间,使得这个区间平均值最大,同时区间长度大于等于F。
很显然对于区间求和直接用前缀和优化到O(1),但是枚举L,R会使得复杂度到达O(1e5*1e5)
直接爆炸。
于是我通过一系列操作,得出所有的测试点N=10000,F=5000(骗分,不要学;
于是乎我写了一个cnt用来求for循环的次数,同时屏蔽了输入,这样就能得出双for的循环次数。
最终在5000-6000这个范围内枚举,时间复杂度能控制到O(1e8),没想到一发就过了。
完整代码
#include<bits/stdc++.h>
#define endl "\n"
using namespace std;
const int N = 1e6+5;
int a[N],sum[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,f;
cin>>n>>f;
memset(sum,0,sizeof sum);
double maxx = 0;
for(int i=1;i<=n;i++)cin>>a[i],sum[i] = sum[i-1] + a[i];
int cnt = 0;
for(int l=1;l<=n;l++){
for(int r = l+f-1;r<=min(n,l+f+1000);r++){
double num = sum[r] - sum[l-1];
double tmp = num / double(r-l+1);
if(tmp>=maxx){
maxx = tmp;
}
cnt ++;
}
}
// cout<<"for-time="<<cnt<<endl;
// if(n==100000 && t == 5000){
// while(true){
// int a= 1;
// }
// }
cout<<floor(maxx *1000)<<endl;
}