每日一题 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 }
请各位大佬斧正(反正我不认识斧正是什么意思)