LeetCode 849.到最近的人的最大距离
注意两边的特殊情况,与其一个个找,不如把下标保存在一个vector中,直接遍历这个vector就行
#include<iostream>
#include<algorithm>
#define rep(i,a,b) for(int i=(a); i<(int)(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(int)(b);++i)
using namespace std;
static const auto io_sync_off = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
short s[20005];
int main()
{
int n;
cin>>n;
rep(i,0,n)
cin>>s[i];
int x=0,y=0;
rep(i,0,n)
if(s[i])
{
x=i;
break;
}
for(int i=n-1;i>=0;--i)
if(s[i])
{
y=i;
break;
}
int l=0,r=0,cnt=0,ans=max(x-0,n-1-y);;
rep(i,0,n)
{
if(s[i]&&cnt==1)
{
r=i;
int mid=l+(r-l)/2;
ans=max(ans,mid-l);
l=r;cnt=0;
}
if(s[i]&&cnt==0)
{
l=i;
++cnt;
}
}
cout<<ans;
return 0;
}
直接保存
#include<vector>
#include<iostream>
#define rep(i,a,b) for(int i=(a); i<(int)(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(int)(b);++i)
using namespace std;
static const auto io_sync_off = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
short s[20005];
int main()
{
vector<int> nums;
int n;
cin>>n;
rep(i,0,n)
{
cin>>s[i];
if(s[i])
nums.push_back(i);
}
int ans=max(nums.front(),n-1-nums.back());
rep(i,1,nums.size())
ans=max(ans,(nums[i]-nums[i-1])/2);
cout<<ans;
return 0;
}