开启掘金成长之旅!这是我参与「掘金日新计划·2月更文挑战」的第21天,点击查看活动详情
牛客小白月赛2 B小马过河(几何)
题解:
有三个点的位置,通过两个点的坐标可以求出直线的斜率
直线中:有斜率,有点的坐标,可以通过点斜式写出直线的解析式
过点,作通过两直线垂直,,求出直线的斜率
直线通过点 那么也可以通过点斜式写出直线的解析式
直线和直线的交点即 要求的垂足。
特殊情况,特殊判断:
常规情况:
直线:
直线通过点且斜率为
直线的解析式:
过点,作通过两直线垂直,则直线UV的斜率为
直线的解析式:
联立直线和:
int main() {
int _, cin >> _;
while (_--) {
double px, py, ux, uy, vx, vy;
cin >> px >> py >> ux >> uy >> vx >> vy;
if (ux == vx) printf("%.7lf %.7lf\n", ux, py);
else if (uy == vy) printf("%.7lf %.7lf\n", px, uy);
else {
double k = (vy - uy) / (vx - ux);
double x = (k * k * vx - k * vy + px + k * py) / (k * k + 1);
double y = k * (x - vx) + vy;
printf("%.7lf %.7lf\n", x, y);
}
}
return 0;
}
# 牛客小白月赛2 J-美(构造)
选美大赛,这套题有点阴间
题意,要求选出差值的和最大,依旧是构造题
构造:一个最大,一个最小,一个次大,一个次小 ... 以此类推,这样的差之和最大。
举例:1 2 3 4 5
结果:5 1 4 2 3
注意:当 i = 1时,R0 = Rn,所以初始化 ans = abs(b[1] - b[n])
那么就是注意一下下标即可。
const int N = 100010;
int a[N], b[N];
signed main() {
int n, cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
int idx = 0;
for(int i = 1; i <= n; i += 2) b[i] = a[++idx];
if (n % 2) for (int i = n - 1; i > 0; i -= 2) b[i] = a[++idx];
else for (int i = n; i > 0; i -= 2) b[i] = a[++idx];
int ans = abs(b[1] - b[n]);
for (int i = 2; i <= n; i++) ans += abs(b[i] - b[i - 1]);
cout << ans << endl;
return 0;
}