列表

详情


NC25156. 游戏

描述

John的 N (1 <= N <= 1000) 头奶牛 (从 1 到 N 依次编号 )打算玩游戏 Serious Cow Tag。在 Serious Cow Tag这个游戏里,每头牛在牧场网格中取一个点 (-7500 <= X <= 7500, -7500 <= Y <= 7500) 使得每一对牛的距离都是与众不同的。
奶牛们轮流玩这个游戏,从 #1 号牛开始,然后是 #2, #3, 等等 (只要这头牛仍然参与这个游戏)。每次轮到的玩的牛,会选择一个目前离它最近的牛,走过去拍它一下,然后回到原来的位置,这样那头被拍的牛就被游戏排除在外了。
当只有一头牛留下来了以后,游戏即告结束,那头牛就是赢家。
农民 John 正和邻居们打赌那头牛会赢,所以他想事先知道谁是赢家。写一个程序,读入每头牛的位置,求哪头牛获胜。

输入描述

Line 1: 一个整数N, 奶牛的数量
Lines 2..N+1: 第 i+1 有两个用空格分开的整数,描述第 i 头牛的坐标位置。

输出描述

Line 1: 获胜的牛的编号。

示例1

输入:

3
0 0
0 3
4 3

输出:

3

说明:

三头牛在 (0, 0), (0, 3) 和 (4, 3)。
牛 1 先走,去拍了离它最近的牛 2。2号牛就被删除了,接下去就直接轮到 Cow 3 走。她去拍了1号,1号被排除,最终3号获胜。

原站题解

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

Python3(3.5.2) 解法, 执行用时: 1003ms, 内存消耗: 3716K, 提交时间: 2019-06-16 14:19:55

def dis(p, q):
    return ((p[0]-q[0])**2 + (p[1]-q[1])**2)

n = int(input())
l = []
for _ in range(n):
    l.append(tuple(map(int, input().split())))
fil = [1 for i in range(n)]
i = 0
while (sum(fil) > 1):
    while (fil[i] == 0):
        i += 1
        i = i%n
    dic = {}
    z = 0
    sl = n
    for j in range(n):
        if (j==i):
            continue
        if (fil[j]):
            di = dis(l[i], l[j])
            dic[j] = di
            if (sl == n):
                sl = j
                z = di
            if (di < z):
                sl = j
                z = di
    fil[sl] = 0
    i += 1
    i = i%n
i = 0
while (fil[i] == 0):
    i += 1
    i = i%n
print(i+1)

C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 492K, 提交时间: 2019-06-14 16:17:21

#include <iostream>
#include <stdio.h>
using namespace std;
int n,x[1010],y[1010],dead[1010];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
	int now=1;
	for(int i=1;i<n;i++)
	{
		while(dead[now]){now++;if(now>n) now-=n;} 
		int mindis=1<<30,id;
		for(int j=1;j<=n;j++)
		{
			if(j==now||dead[j]) continue;
			int dis=(x[now]-x[j])*(x[now]-x[j])+(y[now]-y[j])*(y[now]-y[j]);
			if(dis<mindis) mindis=dis,id=j;
		}
		//cout<<now<<"-->"<<id<<endl;
		dead[id]=1;
		now++;if(now>n) now-=n;
	}
	while(dead[now]){now++;if(now>n) now-=n;}
	printf("%d\n",now);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 484K, 提交时间: 2019-06-14 12:24:22

#include<stdio.h>
#define N 1005
int G[N][2];
int dis(int a,int b) {
	int x=G[a][0]-G[b][0],y=G[a][1]-G[b][1];
	return x*x+y*y;
}
int main() {
	int cur,n,i,j,live[N],out,mind,d;
	scanf("%d",&n);
	for(i=1;i<=n;i++) {
		live[i]=1;
		scanf("%d%d",&G[i][0],&G[i][1]);
	}
	for(cur=1,i=1;i<n-1;i++) {
		mind=0;
		for(j=1;j<=n;j++) {
			if(!live[j] || j==cur) continue;
			d=dis(cur,j);
			if(d<mind || !mind) {
				mind=d,
				out=j;
			}
		}
		live[out]=0;
		while(1) {
			cur++;
			if(cur>n) cur=1;
			if(live[cur]) break;
		}
	}
	printf("%d",cur);
	return 0;
}

上一题