本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
【ICPC】2020银川站 A. Best Player | 签到、模拟
下午跟队友 vp 了 2020 银川站,A 题读错题三次……不过最终过了 6 题,还是很开心的。跟上周末打铁的经历形成鲜明对比。
题目链接
题目
题目大意
Bob 和舍友一起玩游戏,规则如下:
- 指定一个室友,他在纸上写下三维欧几里得空间中 个点的坐标。
- 其他室友中的每一个都选择 X 轴、Y 轴和 Z 轴中的一个,没有两个人做出相同的选择。
- 每一个人都在沿着所选坐标轴的方向,将所有写下的点投影到一个二维平面中。投影后某些点可能无法区分。例如,沿Z轴方向投影的点(1,2,1)和(1,2,5)是不可区分的。
令选择 X 轴的舍友将点投影后二维平面 YOZ 内互不相同的点的数量为 ,选择 Y 轴的舍友将点投影后二维平面 XOZ 内互不相同的点的数量为 ,选择 Z 轴的舍友将点投影后二维平面 XOY 内互不相同的点的数量为 。则最终三人的将会以点的数量为第一关键字,坐标轴的字典序为第二关键字进行排序。输出第一名选择的坐标轴(X、Y 或 Z)。
思路
按题意模拟即可,分别统计所有输入的 个点投影到三个二维平面中不同的点的数量,比较后输出答案。
代码
#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;
}