列表

详情


NC20616. 御坂网络

描述

作为「Misaka Network」的中心司令塔的 LastOrder出事了,为了维持 「Misaka Network」的正常工作,需要临时选出一个Sister作为中心司令塔。

为了弥补能力上的不足,对于选出的Sister有一些要求。
具体来说,平面上有 n 个 Sister,问能否找到一个Sister作为中心司令塔,使得其他 Sister 都在以她为圆心的一个圆上,如果找不到这样的Sister,则输出 "-1"(不含引号)。

输入描述

第一行一个数 n
接下来 n 行,第 i 行两个整数 xi, yi ,表示第 i 个Sister在平面上的坐标。

输出描述

输出共一个数,表示选出的Sister的编号,如果找不到则输出 "-1"。

示例1

输入:

3
1 1
0 1
1 2

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 8ms, 内存消耗: 376K, 提交时间: 2019-12-05 15:37:02

#include<cstdio>
using namespace std;
const int maxn=1005;
int n,a[maxn],b[maxn];
bool check(int i){
    int x=0;
    for (int j=1;j<=n;++j) if (j!=i){
        int y=(a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]);
        if (!x) x=y;if (x!=y) return 0;
    }
    return 1;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;++i) scanf("%d%d",&a[i],&b[i]);
    for (int i=1;i<=n;++i) if (check(i)) {printf("%d\n",i);return 0;}
    printf("-1\n");
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 492K, 提交时间: 2018-10-12 19:16:01

#include<cstdio>
using namespace std;
const int maxn=1005;
int n,a[maxn],b[maxn];
bool check(int i){
	double x=0;
	for (int j=1;j<=n;++j) if (j!=i){
		int y=(a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]);
		if (!x) x=y;if (x!=y) return 0;
	}
    return 1;
}
int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;++i) scanf("%d%d",&a[i],&b[i]);
	for (int i=1;i<=n;++i) if (check(i)) {printf("%d\n",i);return 0;}
	printf("-1\n");
	return 0;
}

Python(2.7.3) 解法, 执行用时: 564ms, 内存消耗: 47460K, 提交时间: 2018-10-12 19:41:26

n = input()
m = {i: set() for i in xrange(n)}
s = []
for _ in xrange(n):
    s.append(map(int, raw_input().split()))
for i in xrange(n):
    for j in xrange(i + 1, n):
        (x1, y1), (x2, y2) = s[i], s[j]
        dist = (x1 - x2) ** 2 + (y1 - y2) ** 2
        m[i].add(dist)
        m[j].add(dist)
for k, v in m.iteritems():
    if len(v) == 1:
        print k + 1
        exit()
print '-1'

Python3(3.5.2) 解法, 执行用时: 1103ms, 内存消耗: 3684K, 提交时间: 2018-10-12 19:53:33

n = int(input())
a = []
for i in range(n):
    x, y = map(int, input().split())
    a.append((x, y))
pos = -1
for i in range(n):
    st = set()
    for j in range(n):
        if i == j:
            continue
        st.add((a[i][0] - a[j][0]) * (a[i][0] - a[j][0]) + (a[i][1] - a[j][1]) * (a[i][1] - a[j][1]))
    if len(st) == 1:
        pos = i + 1
        break
print(pos)

上一题