标签:二分 last int mid long 这道题 简单 return 例题
第一题 愤怒的牛
这道题绝对是二分答案的入门题,简单易懂。
但是针对 L,R,mid 的这三个变量,我还是思考了很长时间。
所以这也要说一下
L 是满足条件的最小值
mid=(L+R)/2;
R 是满足条件的最大值
这道题让求最大的最小,所以当然是输出 R。
第二题 Best Cow Fences
这道题luogu上也有: 平均数
这道题最开始感觉真的好难,我想了好几种,都是 N^2*logN 的,显然过不了。
因为为了满足 子段长度>=k这个条件,我用的是N^2的,所以要想一种更优秀的方法
!!给下面划重点 !!
先用前缀和处理一下,并且每一项在加进去之前都要-mid。
要求>=k,①只需要满足一次即可
②只要>=0就行
根据①,我们找到一次就 break;
根据②,我们模拟前缀和 1~i-k 的最小值就好。
所以不用模拟开头,少一个N
整体算法变为N*logN
CODE:
#include<bits/stdc++.h>
using namespace std;
int n,m,L,R,ans;
long long s[100005],a[100005],Max;
bool check(){
long long last=0;
for(int i=m;i<=n;i++){
if(s[i]-last>=0) return true;
last=min(last,s[i-m+1]);
}
return false;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
a[i]*=1000;
Max=max(a[i],Max);
}
L=0,R=Max;
long long mid;
while(L<=R){
mid=(L+R)/2;
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]-mid;
if(check()) L=mid+1;
else R=mid-1;
}
cout<<R;
return 0;
}
标签:二分,last,int,mid,long,这道题,简单,return,例题 来源: https://www.cnblogs.com/fashpoint/p/11330464.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。