質問の意味:
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は必死に鳥かわいい猫が欲しい、あなたは彼を助けることができますか?
入力:
入力の複数のセット、各入力1 N、Nを発現数、長さN CATの配列の入力後、CAT [I] <= 1E9 ,. 3 <= N - <= 1E5の
出力:
出力が新しい配列をANSメディアン
サンプル入力:
4
1 3 2 4。
3。
1 10 2。
サンプル出力:
1
8つの。
アイデア:
ソートする列の数、列の数を入力します。質問の意味理解、[N-1] -a [の最大数 0]。中央位置(N *(N-1) / 2 + 1)/ 2。真ん中の位置のメジアン合計数が、そう数が中央値よりも小さいことが少ない中央値よりも数よりも大きい数に等しくなければならないので列挙は、2で割りました。常にこの方法で検索し、比較、我々は中央の最終の値を取得することができます。
コード:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[100050];
int find(int x,int n)
{
int l=0,r=n-1,ans=-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(a[mid]>=x)
{
ans=mid;
r=mid-1;
}
else if(a[mid]<x)
{
l=mid+1;
}
}
if(ans==-1)
{
ans=n;
}
return ans;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
//cin>>a[i];
}
sort(a,a+n);
int r=a[n-1]-a[0];
int l=0;
int cm=(n*(n-1)/2+1)/2;
while(l<=r)
{
int mid=(l+r)>>1;
int count=0;
for(int i=0;i<n;i++)
{
count=count+n-find(a[i]+mid,n);
}
if(count>(n*(n-1)/2-cm))
{
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<r<<endl;
}
return 0;
}