A. Maximum Average Segment ###K ###K //K
题目链接:https://codeforces.ml/edu/course/2/lesson/6/4/practice/contest/285069/problem/A
题意:求一段连续的长度不小于k的 且平均值最大的区间
思路:二分check平均值 然后让每个a[i]-mid 来获得他的贡献值 然后前缀和维护
找到 长度不小于k的 区间 只要sum >=0 证明合法 前面的区间一直取min 来判断哪一段区间是最没用的
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define ull unsigned long long 5 #define pb push_back 6 #define pi pair<int,int> 7 #define fi first 8 #define sc second 9 10 const int maxn=1e5+10; 11 const int mod=1e9+7; 12 13 14 int a[maxn]; 15 int n,d; 16 double pre[maxn]; 17 18 int sl,sr; 19 20 bool check(double x) 21 { 22 for(int i=1;i<=n;i++) 23 { 24 double y=a[i]-x; 25 pre[i]=pre[i-1]+y; 26 } 27 28 int tl=1; 29 double mi=0; 30 for(int i=d;i<=n;i++) 31 { 32 if(pre[i-d]<mi) 33 { 34 mi=pre[i-d]; 35 tl=i-d+1; 36 } 37 if(pre[i]-mi>=0) 38 { 39 sl=tl; 40 sr=i; 41 return 1; 42 } 43 } 44 return 0; 45 46 } 47 48 49 int main() 50 { 51 ios::sync_with_stdio(0); 52 cin.tie(0); 53 cin>>n>>d; 54 for(int i=1;i<=n;i++) cin>>a[i]; 55 double l=0,r=100; 56 for(int i=0;i<100;i++) 57 { 58 double mid=(l+r)/2; 59 if(check(mid)) l=mid; 60 else r=mid; 61 } 62 63 cout<<sl<<" "<<sr<<'\n'; 64 65 66 67 68 69 70 71 }

浙公网安备 33010602011771号