リンク:
https://vjudge.net/problem/LightOJ-1410
質問の意味:
2次元平面ではNの人が立っていると、それらの各々は、彼の手に銃を持っています。平面は、人がポイントとみなすことができ、その位置は、デカルト座標として与えられるように大きいです。N人のそれぞれは、一度だけ彼の手に銃と同一または類似の時点でそれらの火の無い2を(何の音が同時実行のために見落とされていないように、2つの銃声の音は、誰もが同時に聞いたことはありません)火災。すべてのこれらの人々の聞い能力はまったく同じです。その一人が、距離R1の音を聞くことができる1人が、距離R2で音を聞くことができない場合ので、他のN-1の者が他のすべての者との距離R2で音を聞くだけでなくすることができないことができるかどうかを意味します。
すべての銃が発射された後、N人は、それらのすべては、彼らが(自分のショットを含まない)聞いたことがどのように多くの銃のショット尋ねられ、Nに1から番号が付けられ、彼らは彼らの評決を与えます。あなたは彼らの評決が真であるが、その判決が一貫している場合は、判断することが可能であるかどうかを判断することはできません。例えば、上の図を見てください。そこに5人であり、その座標は(1,2)、(3,1)、(5,1)、(6,3)及び(1,5)であり、これらは1、2、3、4として番号付けされていますそれぞれ5。それらのすべての5つが彼らの銃を撃った後、あなたはそれらのそれぞれは聞いたことがどのように多くのショットにそれらを求めます。そこ応答はそれぞれ1、1、1、2と1である場合さて、あなたは(1、1、1、2、1)として表すことができます。しかし、人4が聞く2つのショットならば、彼はショットを聞いている必要がありますので、これは矛盾した判決では、人物2で解雇しました、その後、明らかに人2は、ショットが(1と3人4人よりも2に近いある人物)人物1、3、4により発射聞いている必要があります。しかし、彼らの意見が人2は、彼が唯一の1ショットを聞いたことを述べていることを示しています。一方、(1、2、2、1、0)は、このシナリオのために一致判定されるように(2、2、2、1、1)です。人は、ほとんどの4回のショットで聞くことができるので、このシナリオでは(5、5、5、4、4)は一貫評決ではありません。
N人の位置を考えると、あなたの仕事は、そのシナリオのためのさまざまな一貫性の評決の合計数を見つけることです。少なくとも一人の意見が異なっている場合、2件の評決は異なります。
アイデア:
任意の2つの間の距離を計算し、数の異なる種類の数は距離であります
コード:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
const int INF = 1e9;
const int MAXN = 710;
const int MOD = 1e9+7;
int x[MAXN], y[MAXN];
int n;
int len[MAXN*MAXN];
int GetLen(int i, int j)
{
return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
int main()
{
int t, cnt = 0;
scanf("%d", &t);
while(t--)
{
printf("Case %d:", ++cnt);
scanf("%d", &n);
for (int i = 1;i <= n;i++)
scanf("%d%d", &x[i], &y[i]);
int pos = 0;
for (int i = 1;i <= n;i++)
{
for (int j = i+1;j <= n;j++)
len[++pos] = GetLen(i, j);
}
sort(len+1, len+1+pos);
int res = unique(len+1, len+1+pos)-(len+1);
printf(" %d\n", res+1);
}
return 0;
}