网易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;
}

全部评论
直接输出n过30%。。。
点赞 回复
分享
发布于 2017-09-09 18:08

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务