【ICPC】2020银川站 A. Best Player | 签到、模拟

266 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

【ICPC】2020银川站 A. Best Player | 签到、模拟

下午跟队友 vp 了 2020 银川站,A 题读错题三次……不过最终过了 6 题,还是很开心的。跟上周末打铁的经历形成鲜明对比。

题目链接

Problem - A - Codeforces

题目

image.png

题目大意

Bob 和舍友一起玩游戏,规则如下:

  • 指定一个室友,他在纸上写下三维欧几里得空间中 nn 个点的坐标。
  • 其他室友中的每一个都选择 X 轴、Y 轴和 Z 轴中的一个,没有两个人做出相同的选择。
  • 每一个人都在沿着所选坐标轴的方向,将所有写下的点投影到一个二维平面中。投影后某些点可能无法区分。例如,沿Z轴方向投影的点(1,2,1)和(1,2,5)是不可区分的。

令选择 X 轴的舍友将点投影后二维平面 YOZ 内互不相同的点的数量为 cntxcnt_x,选择 Y 轴的舍友将点投影后二维平面 XOZ 内互不相同的点的数量为 cntycnt_y,选择 Z 轴的舍友将点投影后二维平面 XOY 内互不相同的点的数量为 cntzcnt_z。则最终三人的将会以点的数量为第一关键字,坐标轴的字典序为第二关键字进行排序。输出第一名选择的坐标轴(X、Y 或 Z)。

思路

按题意模拟即可,分别统计所有输入的 nn 个点投影到三个二维平面中不同的点的数量,比较后输出答案。

代码

#include <bits/stdc++.h>

using namespace std;

int x[105],y[105],z[105],xx[1005][1005],yy[1005][1005],zz[1005][1005];
int cntx,cnty,cntz,n;
int solve()
{
	cntx=0;
	cnty=0;
	cntz=0;
	memset(xx,0,sizeof(xx));
	memset(yy,0,sizeof(yy));
	memset(zz,0,sizeof(zz));
	scanf("%d",&n);
	for (int i=1;i<=n;++i)
	{
		scanf("%d%d%d",&x[i],&y[i],&z[i]); 
		x[i]+=200;
		y[i]+=200;
		z[i]+=200;
		cntx+=(!xx[y[i]][z[i]]);
		cnty+=(!yy[x[i]][z[i]]);
		cntz+=(!zz[x[i]][y[i]]);
		xx[y[i]][z[i]]++;
		yy[x[i]][z[i]]++;
		zz[x[i]][y[i]]++;
	}
	if (cntx>=cnty&&cntx>=cntz) return printf("X\n"),0;
	if (cnty>=cntz) return printf("Y\n"),0;
	printf("Z\n");
	return 0;
}
int main()
{
	int T=1;
	while (T--) solve();
	return 0;
}