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 }
View Code

 

posted @ 2020-12-24 20:22  canwinfor  阅读(213)  评论(0)    收藏  举报