LOJ P10012 Best Cow Fences 题解

每日一题 day48 打卡

Analysis

二分答案,判断序列的平均值是否大于等于mid

具体怎么实现呢?

将序列减去mid,再用前缀和来维护平均值就好了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define int long long
 6 #define maxn 100000+10
 7 #define INF 2147483647
 8 #define rep(i,s,e) for(register int i=s;i<=e;++i)
 9 #define dwn(i,s,e) for(register int i=s;i>=e;--i)
10 using namespace std;
11 inline int read()
12 {
13     int x=0,f=1;
14     char c=getchar();
15     while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
16     while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
17     return f*x;
18 }
19 inline void write(int x)
20 {
21     if(x<0) {putchar('-'); x=-x;}
22     if(x>9) write(x/10);
23     putchar(x%10+'0');
24 }
25 
26 int n,L,l,r,ans;
27 int a[maxn],sum[maxn],b[maxn];
28 inline bool check(int x)
29 {
30     rep(i,1,n) b[i]=a[i];
31     rep(i,1,n) b[i]-=x;
32     rep(i,1,n) sum[i]=sum[i-1]+b[i];
33     int min_val=INF;
34     rep(i,L,n)
35     {
36         min_val=min(min_val,sum[i-L]);
37         if(sum[i]-min_val>=0) return true;
38     }
39     return false;
40 }
41 signed main()
42 {
43     n=read();L=read();
44     rep(i,1,n) 
45     {
46         a[i]=read(); 
47         a[i]*=1000;
48     }
49     l=0,r=100000000;
50     while(l<r)
51     {
52         int mid=(l+r+1)/2;
53         if(check(mid)==true) 
54         {
55             ans=mid;
56             l=mid;
57         }
58         else r=mid-1;
59     }
60     if(ans%10==9) write(ans+1);
61     else write(ans);
62     return 0;
63 }

请各位大佬斧正(反正我不认识斧正是什么意思)

猜你喜欢

转载自www.cnblogs.com/handsome-zyc/p/11917568.html