Xeniaとカラフルな宝石CodeForces-1337D(数学+ 2ポイント)

Xeniaは、貴族として生まれた少女です。彼女の家族の柔軟性と過酷さのために、Xeniaは自分を楽しませるいくつかの方法を見つける必要があります。

Xeniaは最近、nrの赤い宝石、ngの緑の宝石、nbの青い宝石を購入しました。それぞれの宝石には重みがあります。

今、彼女は3つの宝石を選ぶつもりです。

Xeniaはカラフルなものが大好きなので、各色の宝石を1つだけ選びます。

Xeniaはバランスが大好きなので、体重の差がほとんどない宝石を選びます。

具体的には、選択した宝石の重みがx、y、zであるとすると、Xeniaは(x-y)2+(y-z)2+(z-x)2の最小値を見つけたいと考えています。彼女の親愛なる友人として、あなたは彼女を助けることができますか?

入力
最初の行には、単一の整数t(1≤t≤100)—テストケースの数が含まれます。次に、t個のテストケースが続きます。

各テストケースの最初の行には、3つの整数nr、ng、nb(1≤nr、ng、nb≤105)が含まれています。それぞれ、赤い宝石、緑の宝石、青い宝石の数です。

各テストケースの2行目には、nr整数r1、r2、…、rnr(1≤ri≤109)が含まれています。riはi番目の赤い宝石の重みです。

各テストケースの3行目には、ng整数g1、g2、…、gng(1≤gi≤109)が含まれています。giはi番目の緑の宝石の重みです。

各テストケースの4行目には、nb整数b1、b2、…、bnb(1≤bi≤109)が含まれています。biはi番目の青い宝石の重みです。

∑nr≤105、∑ng≤105、∑nb≤105(すべてのテストケースの合計)であることが保証されています。

出力
テストケースごとに、1つの整数を含む行を出力します。これは、Xeniaが検索する最小値です。


入力
5
2 2 3
7 8
6 3
3 1 4
1 1 1
1
1
1000000000
2 2 2
1 2
5 4
6 7
2 2 2
1 2
3 4
6 7
3 4 1
3 2 1
7 3 3 4
6
出力
14
1999999996000000002
24
24
14

最初のテストケースでは、Xeniaには以下の宝石があります。

彼女が重み7の赤い宝石、重み6の緑の宝石、重み4の青い宝石を選択した場合、(x-y)2+(y-z)2+(z- x)2 =(7-6)2+(6-4)2+(4-7)2 = 14.
アイデア:3つの数値が3つとほぼ同じである場合、上記の式は使い果たされますおそらく小さい。選択した3つの数値は大小である必要があるため、配列を修正し、他の2つの配列に移動します。1つの配列でそれ以上の最初の数値を見つけ、もう1つの配列でそれ以下の最初の数値を見つけます、そして上記の答えに従って最小値を取ります。合計で3つのアレイがあるため、合計で6つの組み合わせがあります。O(6nlogn)
コードは次のとおりです。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=1e5+100;
ll r[maxx],g[maxx],b[maxx];
int nr,ng,nb;

inline ll judge(ll a[],int na,ll b[],int nb,ll c[],int nc)
{
	ll x,y,z;
	ll ans=3e18;
	for(int i=1;i<=na;i++)
	{
		x=a[i];
		int pos1=lower_bound(b+1,b+nb+1,x)-b;
		int pos2=upper_bound(c+1,c+nc+1,x)-c;
		if(pos2==1||pos1>nb) continue;
		pos2--;
		y=b[pos1];
		z=c[pos2];
		ans=min(ans,((x-y)*(x-y)+(x-z)*(x-z)+(z-y)*(z-y)));
	}
	return ans;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&nr,&ng,&nb);
		for(int i=1;i<=nr;i++) cin>>r[i];
		for(int i=1;i<=ng;i++) cin>>g[i];
		for(int i=1;i<=nb;i++) cin>>b[i];
		sort(g+1,g+1+ng);
		sort(b+1,b+1+nb);
		sort(r+1,r+1+nr);
		ll ans=3e18;
		ans=min(ans,judge(r,nr,g,ng,b,nb));
		ans=min(ans,judge(r,nr,b,nb,g,ng));
		ans=min(ans,judge(g,ng,r,nr,b,nb));
		ans=min(ans,judge(g,ng,b,nb,r,nr));
		ans=min(ans,judge(b,nb,r,nr,g,ng));
		ans=min(ans,judge(b,nb,g,ng,r,nr));
		cout<<ans<<endl;
	}
	return 0;
}

この質問は、長い間少し不快です。
頑張って(o)/〜

元の記事を668件公開 賞賛されました118件 50,000件以上

おすすめ

転載: blog.csdn.net/starlet_kiss/article/details/105599843