poj 2833 The Average

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; } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值