您的位置:首页 > 其它

poj 2833 The Average

2010-08-01 17:25 393 查看
http://162.105.81.212/JudgeOnline/problem?id=2833

用Java一直过不了, 提示还是RE,- -||(应该是超时了)

下午用C++把Java代码"翻译"了下, AC...

思路是: 使用1 ≤ n1, n2 ≤ 10这个条件, 维护两个数组G[10],L[10].

分别用来存放最大的n1个数和最小的n2个数.

一边读入数据一边维护这两个数组, 并且求出所有数的和sum

最后用sum减去G,L这两个数组的值 / (double)(n - n1 - n2)

#include<iostream>
using namespace std;
#define MAX 100000001
int G[10], L[10], I, J;
int updateG(int n, int tmp, int max)
{
int min = MAX;
bool isOk = false;
for(int i=0; i<n; i++)
{
if(G[i] == max && !isOk)
{
G[i] = tmp;
isOk = true;
}
if(G[i] < min)
min = G[i];
}
return min;
}
int updateL(int n, int tmp, int min)
{
int max = 0;
bool isOk = false;
for(int i=0; i<n; i++)
{
if(L[i] == min && !isOk)
{
L[i] = tmp;
isOk = true;
}
if(L[i]	> max)
max = L[i];
}
return max;
}
int main()
{
//freopen("in.txt", "r", stdin);
int n, n1, n2, min, max, tmp, i;
__int64 sum;
while(scanf("%d%d%d", &n1, &n2, &n) && (n||n1||n2))
{
min = I = J = sum = 0;
max = MAX;
for(i=0; i<n; i++)
{
scanf("%d", &tmp);
sum += tmp;
if(I < n1)
{
if(max > tmp)
max = tmp;
G[I++] = tmp;
}
else
{
if(max < tmp)
max = updateG(n1, tmp, max);
}
if(J < n2)
{
if(min < tmp)
min = tmp;
L[J++] = tmp;
}
else
{
if(min > tmp)
min = updateL(n2, tmp, min);
}
}
for(i=0; i<n1; i++)
sum -= G[i];
for(i=0; i<n2; i++)
sum -= L[i];
double d = (double)sum / (double)(n - n1 - n2);
printf("%0.6f/n", d);
}
return 0;
}


RE的JavaCode,囧

import java.util.Scanner;

public class Main {
static int greatest[] = new int[10];
static int least[] = new int[10];
static int I, J;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n, n1, n2, min, max, tmp;
long sum;
while(in.hasNext()) {
n1 = in.nextInt();
n2 = in.nextInt();
n = in.nextInt();
if(n1 == 0 && n2 == 0 && n == 0)
break;
I = J = 0;
sum = 0;
min = 0;
max = 100000001;
for(int i=0; i<n; i++) {
tmp = in.nextInt();
sum += tmp;
if(I < n1) {
if(max > tmp)
max = tmp;
greatest[I++] = tmp;
} else {
if(max < tmp)
max = updateGreat(n1, tmp, max);
}
if(J < n2) {
if(min < tmp)
min = tmp;
least[J++] = tmp;
} else {
if(min > tmp)
min = updateLeast(n2, tmp, min);
}
}
for(int i=0; i<n1; i++)
sum -= greatest[i];
for(int i=0; i<n2; i++)
sum -= least[i];
double d = (double)sum / (double)(n - n1 - n2);
System.out.printf("%.6f/n", d);
}
}
public static int updateGreat(int n, int tmp, int max) {
int min = 100000001;
boolean isOk = false;
for(int i=0; i<n; i++) {
if(greatest[i] == max && !isOk) {
greatest[i] = tmp;
isOk = true;
}
if(greatest[i] < min)
min = greatest[i];
}
return min;
}

public static int updateLeast(int n, int tmp, int min) {
int max = 0;
boolean isOk = false;
for(int i=0; i<n; i++) {
if(least[i] == min && !isOk) {
least[i] = tmp;
isOk = true;
}
if(least[i] > max)
max = least[i];
}
return max;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: