E题赛时我通过如下代码AC:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+7;
int n,a[N];
bool vis[N];
bool check(int x){
memset(vis,0,sizeof vis);
int cnt=0;
for(int i=2,p=1;i<=n;i++){
while(vis[p]&&p<=n)++p;
if(a[p]<=a[i]/2)++cnt,vis[p]=1;
}
return cnt>=x;
}
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int l=1,r=n>>1,mid,ans=0;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
cout<<ans;
return 0;
}
赛后思考是否可以去掉二分,故改为:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+7;
int n,a[N];
bool vis[N];
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
memset(vis,0,sizeof vis);
int cnt=0;
for(int i=2,p=1;i<=n;i++){
while(vis[p]&&p<=n)++p;
if(a[p]<=a[i]/2)++cnt,vis[p]=1;
}
cout<<cnt;
return 0;
}
但 WA。
感觉不需要二分答案就可以得到答案,但实际上并非如此
求问原因