网易2018校招笔试编程题【射杀怪兽】
逻辑还是不够好,考虑不到特殊情况。
三道题用了半个小时分析思路和算法,准备着手做第三道射杀怪兽的题,半个小时编程,第一次运行ac10%,发现自己没有考虑到界限问题和原点问题,改了半个小时思路还是有点乱,最后ac20%。
刚刚继续改了20分钟,这次应该对了。
#include <iostream>
using namespace std;
void re_zuobiao(long long x[], long long y[], int num)//把主人公放到所有怪兽的中心去,平移所有怪兽。
{
int i;
long long zx = 0;
long long zy = 0;
for (i = 0; i < num; i++)
{
zx += x[i];
zy += y[i];
}
zx = zx / num;
zy = zy / num;
for (i = 0; i < num; i++)
{
x[i] -= zx;
y[i] -= zy;
}
}
//求各个怪兽到原点组成的向量的角度,角度表示用的正切,正割的反。
//一三象限用y/x,二四象限用-x/y
//可以保证垂直向量可以有同一个解。
void max_num(long long x[], long long y[], int num)
{
float theta[50];
int theta_count[50] = { 0 };
int p = 1; // 保留角度数组中的元素个数
float angle;
int i, j;
int flag;
int max = 0;
for (i = 0; i < num; i++)
{
flag = 0;
if (y[i] == 0 || x[i] == 0)
angle = 0;
else
angle = float(y[i]) / float(x[i]);//记号,考虑强制转换是否可以留下小数部分
if (y[i] == 0 && x[i] == 0)
{
theta_count[0] += 1;
continue;
}
if (angle < 0)
angle = -float(x[i]) / float(y[i]);
for (j = 1; j <= p; j++)
{
if (theta[j] == angle)
{
theta_count[j]++;
flag = 1;
}
}
if (flag == 0)
{
theta[p] = angle;
theta_count[p] = 1;
p++;
}
}
for (i = 1; i <= p; i++)
{
if (max < theta_count[i])
{
max = theta_count[i];
}
}
cout << max + theta_count[0];
}
int main()
{
int num;
long long x[50], y[50];
cin >> num;
for (int i = 0; i < num; i++)
cin >> x[i];
for (int j = 0; j < num; j++)
cin >> y[j];
re_zuobiao(x, y, num);
max_num(x, y, num);
return 0;
}
查看4道真题和解析
