寒假3
宙天
https://ac.nowcoder.com/acm/contest/120563/A
F题
解题思路
手动模拟前几次博弈,不难发现每前进 5 格必然导致 1 次换行。不考虑换行,长度为 n 的网格也得走 n−1 步才能到终点。因此最小总步数为 n−1 + n/5。
示列代码:
void solve(){
int n;
cin >> n;
cout << n-1 + n/5 << endl;
}
H题
解题思路
三角形面积可以用向量叉积的绝对值的一半来计算。对于点A(xa, ya), B(xb, yb), O(x, 0),向量OA = (xa - x, ya - 0) = (xa - x, ya),向量OB = (xb - x, yb - 0) = (xb - x, yb)。三角形面积 = |(xa - x)yb - (xb - x)ya| / 2 = |xayb - xyb - xbya + xya| / 2 = |xayb - xbya + x*(ya - yb)| / 2。
设常数C = xayb - xbya,k = ya - yb,则面积 = |C + kx| / 2。要求面积等于2,即|C + kx| = 4。
分类讨论:
如果k = 0,即ya = yb,则|C| = 4。此时C是定值,若|C| = 4,则任意x都满足条件,我们可以输出0;否则无解。
如果k ≠ 0,则方程C + kx = 4 或 C + kx = -4,解得x = (4 - C)/k 或 x = (-4 - C)/k。任选一个输出即可。
注意:题目要求面积与2的绝对误差不超过0.001,使用double计算并保留足够精度即可。(开15位即可)
示列代码:
void solve(){
int xa,ya,xb,yb;
cin>>xa>>ya>>xb>>yb;
ll C=(ll)xa*yb-(ll)xb*ya;
ll k=ya-yb;
if (k==0){
if (C==4||C==-4) {
printf("0\n");
} else {
printf("no answer\n");
}
return;
}
double x1=(4.0-C)/k;
printf("%.15lf\n",x1);
}
