一开始我直接存,然后在三个for循环找到最大最小然后求和再减,于是时间非常的慢- - 导致tle了。。。
然后换成存入的时候直接操作,空间换时间的感觉。。总的来说只要动了二维数组,然后注意下标就好了~
题目:
Description
校歌手大奖赛中每个评委会给每个参赛选手打分,请用类描述每个选手的被评委的评分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,第一行为数据组数T
每组数据第一行两个正整数 n m (3 <= n,m <= 100),表示有 n 个 评 委 , m个选手。
接下来 n 行,每行 m 个正整数。每行表示一个评委给 m 个选手的分数,分数为[0,100]的整数。
Output
请将结果输出对于每组输入数据输出 m 行,每行表示一个选手的得分,结果保留 2 位小数。
Sample Input
1 3 4 1 2 3 4 1 2 3 4 1 2 3 4
Sample Output
1.00 2.00 3.00 4.00
原来的代码也po上来,超时的!:
// Copyright <lijiancheng> [2014]
// Sicily 1817
#include <stdio.h>
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int t;
int arr[100][100];
double ans[100];
int n, m;
scanf("%d", &t);
//cin >> t;
while (t--) {
scanf("%d%d", &n, &m);
//cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &arr[i][j]);
//cin >> arr[i][j];
}
}
int max = 0, min = 0;
// n times
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
max = j;
min = j;
// find the max and min of the arr[i][?]
for (int k = 0; k < n; k++) {
if (arr[max][i] < arr[k][i]) max = k;
if (arr[min][i] > arr[k][i]) min = k;
}
ans[i] += arr[j][i];
}
ans[i] -= arr[max][i];
ans[i] -= arr[min][i];
ans[i] /= (n-2);
printf("%.2lf\n",ans[i]);
}
}
return 0;
}
// Copyright <lijiancheng> [2014]
// Sicily 1817
#include <stdio.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main() {
int t;
int arr[100][100];
int max[100] = {0};
int min[100] = {0};
double ans[100];
int n, m;
scanf("%d", &t);
while (t--) {
// init
memset(max, 0, sizeof(max));
memset(ans, 0, sizeof(ans));
for (int j = 0; j < 100; j++) {
min[j] = 1000;
}
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &arr[i][j]);
ans[j] += arr[i][j];
if (arr[i][j] > max[j]) max[j] = arr[i][j];
if (arr[i][j] < min[j]) min[j] = arr[i][j];
//cin >> arr[i][j];
}
}
for (int i = 0; i < m; i++) {
ans[i] = ans[i] - max[i] - min[i];
printf("%.2lf\n",ans[i]/(n-2));
}
}
return 0;
}