NC20616. 御坂网络
描述
输入描述
第一行一个数 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)