超详题解
2026-01-25 20:40:35
发布于:浙江
6阅读
0回复
0点赞

//框架
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll NM=1e5+2; //不多也不少
ll n,m,a[NM];//好习惯
int main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>m;
while(m--){
}
return 0; //好习惯
}
这个相信大家一定会写
不一定
首先定义三变量R and L and pos
后用pos存储第一个>=k的数
ll pos = lower_bound(a+1,a+n+1,k)-a;
重点是二分怎么写
当然暴力也可以AC
二分
while(left<=right) {
ll mid=left+(right-left)/2;
if(a[mid]>=k){
pos=mid;
right=mid-1;//重点
}else left=mid+1;//重点
}
pos-1 最小是 1用c1存储
pos 最大是 n 用c2存储
再比较一下
输出结果
就行了
二分代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll NM=1e5+2; //不多也不少
ll n,m,a[NM];
int main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>m;
while(m--){
//重点
ll k;
cin>>k;
ll left=1,right=n;
ll pos=n+1;//pos第一个>=k的数
while(left<=right){//lower_bound函数底层逻辑
ll mid=left+(right-left)/2;
if(a[mid]>=k){
pos=mid;
right=mid-1;
}else left=mid+1;
}//其实这样就可以了ll pos = lower_bound(a+1,a+n+1,k)-a;
ll c1=-1,c2=-1;
if(pos>0)c1=a[pos-1];
if(pos<n)c2=a[pos];
//特判一下
ll ans = -1;
if(c1 == -1)ans = c2;
else if(c2 == -1)ans = c1;
else{
ll diff1=abs(c1-k),diff2=abs(c2-k);
if(diff1<diff2)ans = c1;
else if(diff1>diff2)ans = c2;
else ans = min(c1, c2);
}cout << ans << endl;
}
return 0;
}
枚举代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll NM=1e5+5;
ll n,m,a[NM],b[NM];
int main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++)cin >> a[i];
cin>>m;
for(int i = 1;i <= m;i++){
cin>>b[i];
ll minn = INT_MAX,ans=0;
for(int j = 1;j <= n;j++){
if(abs(a[j]-b[i]) < minn){
ans=a[j];
minn=abs(a[j]-b[i]);
}
}cout<<ans<<endl;
}
return 0;
}
虽然能AC但我建议别这样做
数据再大点就得TLE了
真正100%AC超简洁代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll NM=1e5+2;
ll n,m,a[NM];
int main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>m;
while(m--){
ll k;
cin>>k;
ll pos=lower_bound(a+1,a+n+1,k)-a,c1=-1,c2=-1,ans = -1;
if(pos>0)c1=a[pos-1];
if(pos<n)c2=a[pos];
if(c1==-1)ans=c2;
else if(c2==-1)ans=c1;
else{
ll diff1=abs(c1-k),diff2=abs(c2-k);
if(diff1<diff2)ans=c1;
else if(diff1>diff2)ans=c2;
else ans=min(c1, c2);
}cout << ans << endl;
}return 0;
}
全部评论 6
d
5天前 来自 浙江
0d
5天前 来自 浙江
0d
5天前 来自 浙江
0d
5天前 来自 浙江
0d
5天前 来自 浙江
0d
5天前 来自 浙江
0



有帮助,赞一个