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