时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
小明在二维坐标系中放置了 n 个点,他想在其中选出一个包含三个点的子集,这三个点能组成三角形。然而这样的方案太多了,他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形?
【输入格式】
输入共 n + 1 行。
第一行为一个正整数 n。
后面 n 行,每行两个整数 x
double dis(int a, int b) {
return sqrt((p[a].x - p[b].x) * (p[a].x - p[b].x) + (p[a].y - p[b].y) * (p[a].y - p[b].y)) * 1.00;
signed main(){
cin >> n;
for (int i = 1; i <= n; i++) cin >> p[i].x >> p[i].y;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) {
for (int k = 1; k < j; k++) {
double a = dis(i, j);
double b = dis(i, k);
double c = dis(j, k);
if (a + b > c && a + c > b && b + c > a)
if ((a == b) || (a == c) || (b == c)) ans++;
cout << ans << endl;
return 0;
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
给定一个包含 N 个结点 M 条边的无向图 G,结点编号 1 . . . N。其中每个
结点都有一个点权 W
i。
你可以从 M 条边中任选恰好一条边删除,如果剩下的图恰好包含 2 个连通
分量,就称这是一种合法的删除方案。
对于一种合法的删除方案,我们假设 2 个连通分量包含的点的权值之和分
别为 X 和 Y,请你找出一种使得 X 与 Y 的差值最小的方案。输出 X 与 Y 的差
值。
【输入格式】
第一行包含两个整数 N 和 M。
第二行包含 N 个整数,W
N。
以下 M 行每行包含 2 个整数 U 和 V,代表结点 U 和 V 之间有一条边。
【输出格式】
一个整数代表最小的差值。如果不存在合法的删除方案,输出 −1。
【样例输入】
10 20 30 40
【样例输出】
【样例说明】
由于 1 和 2 之间实际有 2 条边,所以合法的删除方案有 2 种,分别是删除(2, 3) 之间的边和删除 (3, 4) 之间的边。
删除 (2, 3) 之间的边,剩下的图包含 2 个连通分量:{1, 2} 和 {3, 4},点权和分别是 30、70,差为 40。
删除 (3, 4) 之间的边,剩下的图包含 2 个连通分量:{1, 2, 3} 和 {4},点权和分别是 60、40,差为 20。
【评测用例规模与约定】
对于 20% 的数据,1 ≤ N, M ≤ 10000。
对于另外 20% 的数据,每个结点的度数不超过 2。
对于 100% 的数据,1 ≤ N, M ≤ 200000,0 ≤ W
i ≤ 109,1 ≤ U, V ≤ N。
最近马上国赛了,看了看自己写的这题发现是错误的。特此改正😶
这题就是tarjan算法
求割边
割边:
对于一个无向图,如果删掉一条边后图中的连通块个数增加了,则称这条边为桥或者割边
简单来说,删掉割边,一个图就会变成两个连通子图
主体情况,枚举割边,计算两边的连通子图的差值(这里算一个子图权值和就行,另一个通过总权值和减去当前这个子图值和)
特殊情况:
- 没有割边
- 原来的图本来就是两个连通分量(直接给出答案就行)
题目没有说不连通的情况只有两个连通分量,这点如果硬要考虑的话还要加判断,但是这个代码就可以在蓝桥杯上拿满了。🥳