トピック:TT -神秘的な贈り物
イタリアということ:
TTは、B駅で毎日ふける上の深刻な猫愛好家、猫のチャネルです。
ある日、TTは、この問題を解決することができればZJMは、TT TTに問題を決めた友人、ZJMはかわいい猫がTTを与えた購入します。
概要アレイと[I] [i]を数Nアレイの猫を与えられ、新しいアレイANSが生成されます。これは、任意のI、Jのための新たな配列として定義され、iがjは=され、あるANS [] = ABS(猫[ I] -猫[J])] 1 <= I <J <= N. この新しい配列は、次いで、中央値は、位置番号に対応するソート(1 + LEN)/ 2であり、中央値を決定し、「/」丸めあります。
TTは必死に鳥かわいい猫が欲しい、あなたは彼を助けることができますか?〜
入力:
入力の複数のセット、長さNの猫、猫のシーケンスの入力後の各入力1 N、Nを発現数、[I] <= 1E9、3 <= N <= 1E5〜
出力:
出力新しい配列ANS中央値〜
例:
アイデア問題解決:暴力の最初に、O(N2)白(暴力も可能に、CSPは、右側の白いVJために、当然のことながら、点在取得できます)。次いで、最適化;それはXJ-xiがなければならないことに0よりも大きいので、最初の元の配列をソートし、XJ-XI <= P使用後、2点Pを見つけ、いくつかのXJ満たす不等式(列挙XI)が存在することがわかり、場合そこXJ(N *(N-1)/ 2 + 1)/ pが中央値(おそらく少ない中央値よりもが、P(LEN + 1)よりも小さい距離の近い記載されている2番目/ 2、pは中央値でない場合、最後の1つのpまで増加し続ける必要があり、プラスの条件が満たされていない場合、p)は、中央値です。もちろん、検索プロセスは、約O(nlogn + nlogn * LOGN)の時間計算量であるXJ二分法であることがあります。
コード:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
int a[100005];
void gengxin()
{
memset(a,0,sizeof(a));
}
int panduan(int k,int n)
{
int total=0,m=n*(n-1)/2;
m=(m+1)/2;
for(int i=0;i<n-1;i++)//通过枚举xi找xj总个数
{
int h=a[i]+k;
int l=0,r=n;
while(l+1<r)//二分
{
int mid=(l+r)/2;
if(a[mid]>h)
{
r=mid;
}else
{
l=mid;
}
}
total=total+(l-i);
}
if(total>=m)//根据xj的总数返回不同的值,0说明p得小点,1说明p得大点
{
return 0;
}else
{
return 1;
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
gengxin();
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);//排序
int l=0,r=a[n-1];
while(l+1<r)
{
int mid=(r+l)/2;
int flag=panduan(mid,n);
if(flag==0)//判断
{
r=mid;
}else
{
l=mid;
}
}
printf("%d\n",r);
}
}