社区讨论
【90pts求条必关】这题分数就给我写个100分吧,大差不差
P2390地标访问参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mlp95jpm
- 此快照首次捕获于
- 2026/02/16 22:11 3 天前
- 此快照最后确认于
- 2026/02/16 22:11 3 天前
CPP
#include<bits/stdc++.h>
using namespace std;
//至多折返1次。折返2次必有重复区域,非最优。
const int maxn=5e4+1;
int a[maxn];
int main(){
//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,t;
cin>>t>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
//cout<<"Sorted array:\n";for(int i=0;i<n;i++)cout<<a[i]<<" ";
//cout<<endl;
/*
* 4种情况
* 1. 一直左
* 2. 一直右
* 3. 先左后右
* 4. 先右后左
*/
//枚举折返点的3、4情况
//先右后左
//cout<<"先右后左"<<endl;
int ans_xyhz=0;
for(int i=0;i<n;i++){
int tempa=a[i];
if(a[i]<0)continue;
else{
int arrivea=2*tempa-t;
ans_xyhz=max(ans_xyhz,int(lower_bound(a,a+n,tempa)-upper_bound(a,a+n,arrivea)+1));
//printf("tempa=%d,arrivea=%d,ans=%d\n",tempa,arrivea,ans_xyhz);
}
}
//先左后右
//cout<<"先左后右"<<endl;
int ans_xzhy=0;
for(int i=0;i<n;i++){
int tempa=a[i];
if(a[i]>0)continue;
else{
int arrivea=t+2*tempa;
ans_xzhy=max(ans_xzhy,int(lower_bound(a,a+n,arrivea)-upper_bound(a,a+n,tempa)+1));
//printf("tempa=%d,arrivea=%d,ans=%d\n",tempa,arrivea,ans_xzhy);
}
}
//一下无需枚举折返点
//一直左
//cout<<"一直左"<<endl;
int ans_yzz=0;
int arrivea_yzz=-t;
ans_yzz=lower_bound(a,a+n,0)-upper_bound(a,a+n,arrivea_yzz);
//printf("arrivea=%d,ans=%d\n",arrivea_yzz,ans_yzz);
//一直右
//cout<<"一直右"<<endl;
int ans_yzy=0;
int arrivea_yzy=t;
ans_yzy=lower_bound(a,a+n,arrivea_yzy)-upper_bound(a,a+n,0);
//printf("arrivea=%d,ans=%d\n",arrivea_yzy,ans_yzy);
//cout<<"Final Answer is: ";
cout<<max(ans_xyhz,max(ans_xzhy,max(ans_yzz,ans_yzy)));
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...