//三分法#include<bits/stdc++.h>usingnamespace std;constint maxn =1e5+10;struct node{int x, y;}a[maxn];int n;doublemaxdis(double x){double ans =0;for(int i =1; i <= n; i++)
ans =max(ans,sqrt(a[i].y*a[i].y+(a[i].x-x)*(a[i].x-x)));return ans;}intmain(){//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%d",&n);for(int i =1; i <= n; i++)scanf("%d %d",&a[i].x,&a[i].y);double l =-10000, r =10000;while((r-l)>1e-7){double midl =(r+l)/2;double midr =(midl+r)/2;if(maxdis(midl)>=maxdis(midr)) l = midl;else r = midr;}printf("%.6f\n",maxdis(r));return0;}
题意:a和b都是x轴上的点,a每次可以选择花费1s跳到
a
3
\sqrt[3]{a}
3a,或者选择以1单位/s的速度前进,问a到达b最少需要多久。
思路:先假设接下来全部按照1单位/s的速度走,na=
c
a
3
\sqrt[3]{ca}
3ca,如果abs(na-cb)+1.0 < abs(ca-cb),那么下一步选择直接跳到na,否则剩下的距离只能全部按照1单位/s的速度走。
E 签到
F dp
思路:题意:AC会说一句话,RJ会连续说x句话,已知共说了n句话,问有多少种说话的排列(且RJ下一次必须是AC) 考虑说的最后一段话是AC还是RJ的时候说的
d
p
[
i
]
[
1
]
dp[i][1]
dp[i][1]表示共说了i句话最后一段话说了一句
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]表示最后一段话说了x句
d
p
[
i
]
[
1
]
=
d
p
[
i
−
1
]
[
0
]
+
d
p
[
i
−
1
]
[
1
]
dp[i][1]=dp[i-1][0]+dp[i-1][1]
dp[i][1]=dp[i−1][0]+dp[i−1][1]
d
p
[
i
]
[
0
]
=
d
p
[
i
−
x
]
[
1
]
dp[i][0]=dp[i-x][1]
dp[i][0]=dp[i−x][1]
a
n
s
[
n
]
=
d
p
[
i
]
[
0
]
+
d
p
[
i
]
[
1
]
ans[n]=dp[i][0]+dp[i][1]
ans[n]=dp[i][0]+dp[i][1]
A 签到B题意:在x轴上找一个点,使得它到给定的点之间的最大距离最小,输出最大距离的最小值思路:答案点的左/右侧,得到的最大距离都比答案大,所以答案所在的点是一个极小值点。可以对在x轴上找的这个点三分,或者对最大距离二分,找到第一个满足答案的最大距离(该距离最小)ac代码://三分法#include <bits/stdc++.h>using namespace...