#洛谷P6332 [COCI2007-2008#1] PRINOVA
习题链接:https://www.luogu.com.cn/problem/P6332
八十分代码,目前问题未解决,请各位指教。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
typedef long long ll;
ll n;
ll a[110];
ll A,B;
ll ans,ans_max=0;
ll maxmin=0,temp;
bool flag=false;
cin>>n;
for(int i=0;i<n;++i) cin>>a[i];
cin>>A>>B;
sort(a,a+n);
//如果数组a与A~B没有交集,则直接等于另一边界值
if(a[0]>=B)
{
if(A%2==1) cout<<A<<endl;
else cout<<A+1<<endl;
flag=true;
}
else if(a[n-1]<=A)
{
if(B%2==1) cout<<B<<endl;
else cout<<B-1<<endl;
flag=true;
}
else for(int i=0;i<n-1;i++)
{
//如果a中元素不在A B范围内,则不计算(因为计算所得值一定不是答案)
if(a[i+1]<A) continue;
else if(a[i]>B) break;
//求相邻两数的平均数(该平均数一定是偶数,所以不用考虑整除问题)
temp=(a[i]+a[i+1])/2;
//如果两个元素一个在范围内,一个在范围外,且平均值在范围外
//X与两点最近距离为A与a[i+1]的距离
if(temp<=A)
{
if(A%2==1) temp=A;
else temp=A+1;
maxmin=abs(a[i+1]-temp);
}
//X与两点最近距离为B与a[i]的距离
else if(temp>=B)
{
if(B%2==1) temp=B;
else temp=B-1;
maxmin=abs(temp-a[i]);
}
//如果平均数是奇数,那么就是他
else if(temp%2==1) maxmin=temp-a[i];
//如果平均数是偶数,那么是他 +或- 1
else
{
temp--;
maxmin=temp-a[i];
}
//更新最大值
if(maxmin>ans_max)
{
ans=temp;
ans_max=maxmin;
}
}
if(flag==false) cout<<ans;
return 0;
}