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