关于 ABC E
  • 板块学术版
  • 楼主CleverRaccoonʕ•ᴥ•ʔ
  • 当前回复17
  • 已保存回复17
  • 发布时间2025/1/11 21:54
  • 上次更新2025/1/12 11:30:40
查看原帖
关于 ABC E
718487
CleverRaccoonʕ•ᴥ•ʔ楼主2025/1/11 21:54

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。

感觉不需要二分答案就可以得到答案,但实际上并非如此

求问原因

2025/1/11 21:54
加载中...