ABC292解题报告
E. Transitivity
题意:有一张有向图,你需要在其中添加若干条边,满足对于任意
,都有 。求最少的添加边数。 。
首先可以转化为最少的总边数,再减去原有的
By SSRS
#include <bits/stdc++.h>
using namespace std;
int main(){
int N, M;
cin >> N >> M;
vector<vector<int>> E(N);
for (int i = 0; i < M; i++){
int u, v;
cin >> u >> v;
u--;
v--;
E[u].push_back(v);
}
int cnt = 0;
for (int i = 0; i < N; i++){
vector<bool> used(N, false);
used[i] = true;
queue<int> Q;
Q.push(i);
while (!Q.empty()){
int v = Q.front();
Q.pop();
for (int w : E[v]){
if (!used[w]){
used[w] = true;
Q.push(w);
}
}
}
for (int j = 0; j < N; j++){
if (j != i && used[j]){
cnt++;
}
}
}
cout << cnt - M << endl;
}
F. Regular Triangle Inside a Rectangle
题意:一个
的矩形里放正三角形,求最大边长。 ,精度误差 。
首先钦定
做法一
直接想感觉会有很多分类讨论,所以可以考虑二分答案。
对于一个边长
于是可以通过勾股定理求出
By cxm1024
#include <bits/stdc++.h>
using namespace std;
#define ld long double
const ld eps = 1e-12, sq3 = sqrt((ld)3);
int a, b;
bool check(ld x) {
if (sq3 * x / 2 > b) return 0;
if (x <= b) return 1;
ld y = sqrt(x * x - b * b);
return sq3 * b / 2 + y / 2 <= a;
}
signed main() {
scanf("%d%d", &a, &b);
if (a < b) swap(a, b);
ld l = 0, r = 2000;
while (l + eps <= r) {
ld mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid;
}
printf("%.11Lf\n", (l + r) / 2);
return 0;
}
做法二
上面的做法显然比较麻烦,其实可以不二分答案而很快地求解。
首先容易发现,如果长边过长,超过了短边的
否则,参考上面二分答案的过程可以发现,答案的
此时便可以直接解出
By SSRS
(注:这份代码里钦定
#include <bits/stdc++.h>
using namespace std;
int main(){
cout << fixed << setprecision(20);
int A, B;
cin >> A >> B;
if (A > B){
swap(A, B);
}
if (B > A * 2 / sqrt(3)){
cout << A * 2 / sqrt(3) << endl;
} else {
cout << hypot(B, A * 2 - B * sqrt(3)) << endl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步