杭电acm1875
发布网友
发布时间:2022-05-30 19:15
我来回答
共3个回答
热心网友
时间:2023-11-03 10:54
给你一个数n
然后三行数字每行n个。
第一行,第i个数a[i]代表id为a[i]的队伍今年的排名为i
第二行,第i个数b[i]代表id为b[i]的队伍去年的排名为i
第三行,第i个数c[i]代表id为i的队伍预期排名为c[i]
让你算一个总分值,计算规则:
1.如果某个队伍今年的排名大于等于预期,则该队的分值为3
2.如果某个队伍今年的排名大于去年的排名,则该队的分值为2,否则为1
计算并输出总分值即可
样例第一个转化以后(把前两行数字都转化为第i个队伍的排名为x[i]的形式)
3 5 4 2 1
2 4 1 5 3
3 5 1 1 2
分值为3 + 3 + 1 + 2 + 3 = 12(请自行计算为何是这个结果)
明白了否?
热心网友
时间:2023-11-03 10:54
注意两个问题:
1.比较的时候能用int决不用double,
2.GCC系列环境输入用lf,输出用f
另外,建图的时候直接去掉不合格的边吧!
代码,AC93ms:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct node {
int x, y;
int z;
} shu[40000];
double xx[105][2];
int p[40000];
int findx(int x) {
if (x == p[x])
return x;
p[x] = findx(p[x]);
return p[x];
}
bool connect(int x, int y) {
int q, w;
q = findx(x);
w = findx(y);
if (q == w)
return false;
p[w] = q;
return true;
}
bool cmp(const node& a, const node& b) {
return a.z < b.z;
}
int main() {
int t, n, i, j, m, x;
double sum;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (i = 0; i < n; i++)
p[i] = i;
for (i = 0; i < n; i++) {
scanf("%lf%lf", &xx[i][0], &xx[i][1]);
}
x = 0;
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
int len = (xx[i][0] - xx[j][0]) * (xx[i][0] - xx[j][0])
+ (xx[i][1] - xx[j][1]) * (xx[i][1] - xx[j][1]);
if (len >= 100 && len <= 1000000) {
shu[x].x = i;
shu[x].y = j;
shu[x].z = len;
x++;
}
}
}
sort(shu, shu + x, cmp);
sum = 0;
m = 1;
for (i = 0; i < x; i++) {
if (connect(shu[i].x, shu[i].y)) {
m++;
sum += 100 * sqrt(shu[i].z);
}
}
x = 0;
for (i = 0; i < n; i++) {
if (p[i] == i)
x++;
}
if (x == 1)
printf("%0.1f\n", sum);
else
printf("oh!\n");
}
return 0;
}
热心网友
时间:2023-11-03 10:55
你也太有才了,不说想干嘛??程序能运行,老鬼知道你哪错了??!!