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;
}