有好心人能帮我分析一下这个暴力的时间复杂度和二分答案的时间复杂度吗
暴力:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[10000001],n,m,maxn=-1e18;
bool check(int x){
int ans=0;
for(int i=1;i<=n;i++){
if(a[i]>=x){
ans+=a[i]-x;
}
}
if(ans>=m) return 1;
else return 0;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
maxn=max(maxn,a[i]);
}
for(int i=0;i<=maxn;i++){
if(check(i)){
continue;
}else{
cout<<i-1;
return 0;
}
}
}
二分答案:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[10000001],n,m,maxn=-1e18;
bool check(int x){
int ans=0;
for(int i=1;i<=n;i++){
if(a[i]>=x){
ans+=a[i]-x;
}
}
if(ans>=m) return 1;
else return 0;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
maxn=max(maxn,a[i]);
}
int l=-1,r=maxn+1;
while(l+1<r){
int mid=(l+r)/2;
if(check(mid)){
l=mid;
}
else r=mid;
}
cout<<l;
}
数据范围:
对于 100% 的测试数据,1≤N≤106,1≤M≤2×109,树的高度 ≤4×105,所有树的高度总和 >M。
dalao们也别说啥了,我就是个蒟蒻