洛谷鏈接:https://www.luogu.com.cn/problem/P3887
不得不說我被這道題整吐了,不知道是因爲我太菜了還是洛谷對java選手不友好,自己打的第一份70分三個點TLE超時。。。第二份用了大根堆4個點TLE。。。第三份對着洛谷c語言題解翻譯成java50分,5個點TLE。。。絕望。。。
70分代碼
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
//K, D, M, F,分別表示守門員、後衛、中場和前鋒
static Queue<Long> K = new LinkedList<Long>();
static Queue<Long> D = new LinkedList<Long>();
static Queue<Long> M = new LinkedList<Long>();
static Queue<Long> F = new LinkedList<Long>();
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int k=in.nextInt();
int d=in.nextInt();
int m=in.nextInt();
int f=in.nextInt();
//K 守門員
long[] a=new long[k];
for(int i=0;i<k;i++) {
a[i]=in.nextInt();
}
Arrays.sort(a);
for(int i=k-1;i>=0;i--) {
K.offer(a[i]);
}
//D 後衛
long[] b=new long[d];
for(int i=0;i<d;i++) {
b[i]=in.nextInt();
}
Arrays.sort(b);
for(int i=d-1;i>=0;i--) {
D.offer(b[i]);
}
//M 中場
long[] c=new long[m];
for(int i=0;i<m;i++) {
c[i]=in.nextInt();
}
Arrays.sort(c);
for(int i=m-1;i>=0;i--) {
M.offer(c[i]);
}
//F 前鋒
long[] e=new long[f];
for(int i=0;i<f;i++) {
e[i]=in.nextInt();
}
Arrays.sort(e);
for(int i=f-1;i>=0;i--) {
F.offer(e[i]);
}
//Q 陣容
int Q=in.nextInt();
double[] ans=new double[Q];
for(int i=0;i<Q;i++) {
int q1=in.nextInt();
int q2=in.nextInt();
int q3=in.nextInt();
ans[i]+=K.poll(); //選擇最好的守門員
for(int j=0;j<q1;j++) { //選擇最好的後衛
ans[i]+=D.poll();
}
for(int j=0;j<q2;j++) { //選擇最好的守中場
ans[i]+=M.poll();
}
for(int j=0;j<q3;j++) { //選擇最好的守前鋒
ans[i]+=F.poll();
}
ans[i]/=q1+q2+q3+1;
}
in.close();
DecimalFormat df=new DecimalFormat("0.00");
for(int i=0;i<Q;i++) {
System.out.println(df.format(ans[i]));
}
}
}
60分代碼
import java.text.DecimalFormat;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
// maxHeap
// 自定義比較器:當compare函數中第一個參數(這裏是較大的元素)需要排在前面時,返回一個負數;反之返回一個正數。
static class maxComparator implements Comparator<Integer>{
@Override
public int compare(Integer arg0, Integer arg1) {
// TODO 自動生成的方法存根
return arg0>=arg1?-1:1;
}
}
//K, D, M, F,分別表示守門員、後衛、中場和前鋒
static PriorityQueue<Integer> K = new PriorityQueue<Integer>(new maxComparator());
static PriorityQueue<Integer> D = new PriorityQueue<Integer>(new maxComparator());
static PriorityQueue<Integer> M = new PriorityQueue<Integer>(new maxComparator());
static PriorityQueue<Integer> F = new PriorityQueue<Integer>(new maxComparator());
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int k=in.nextInt();
int d=in.nextInt();
int m=in.nextInt();
int f=in.nextInt();
//K 守門員
for(int i=0;i<k;i++) {
int a=in.nextInt();
K.offer(a);
}
//D 後衛
for(int i=0;i<d;i++) {
int b=in.nextInt();
D.offer(b);
}
//M 中場
for(int i=0;i<m;i++) {
int c=in.nextInt();
M.offer(c);
}
//F 前鋒
for(int i=0;i<f;i++) {
int e=in.nextInt();
F.offer(e);
}
//Q 陣容
int Q=in.nextInt();
double[] ans=new double[Q];
for(int i=0;i<Q;i++) {
int q1=in.nextInt();
int q2=in.nextInt();
int q3=in.nextInt();
ans[i]+=K.poll(); //選擇最好的守門員
for(int j=0;j<q1;j++) { //選擇最好的後衛
ans[i]+=D.poll();
}
for(int j=0;j<q2;j++) { //選擇最好的守中場
ans[i]+=M.poll();
}
for(int j=0;j<q3;j++) { //選擇最好的守前鋒
ans[i]+=F.poll();
}
ans[i]/=q1+q2+q3+1;
DecimalFormat df=new DecimalFormat("0.00");
System.out.println(df.format(ans[i]));
}
in.close();
}
}
50分代碼
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
static Integer[] a=new Integer[100005];
static Integer[] b=new Integer[100005];
static Integer[] c=new Integer[100005];
static Integer[] d=new Integer[100005];
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int k=in.nextInt();
int g=in.nextInt();
int m=in.nextInt();
int f=in.nextInt();
for(int i=1;i<=k;i++) {
a[i]=in.nextInt();
}
for(int i=1;i<=g;i++) {
b[i]=in.nextInt();
}
for(int i=1;i<=m;i++) {
c[i]=in.nextInt();
}
for(int i=1;i<=f;i++) {
d[i]=in.nextInt();
}
Arrays.sort(a,1,k+1,new Compare());
Arrays.sort(b,1,g+1,new Compare());
Arrays.sort(c,1,m+1,new Compare());
Arrays.sort(d,1,f+1,new Compare());
int q=in.nextInt();
int x1=1,x2=1,x3=1,x4=1;
while(q!=0) {
int q1=in.nextInt();
int q2=in.nextInt();
int q3=in.nextInt();
double ans=0;
ans+=a[x1]; //守門員
x1++;
for(int i=x2;i<x2+q1;i++) { //後衛
ans+=b[i];
}
x2+=q1;
for(int i=x3;i<x3+q2;i++) { //後衛
ans+=c[i];
}
x3+=q2;
for(int i=x4;i<x4+q3;i++) { //後衛
ans+=d[i];
}
x4+=q3;
ans/=11;
DecimalFormat df=new DecimalFormat("0.00");
System.out.println(df.format(ans));
q--;
}
}
}
class Compare implements Comparator<Integer>{
public int compare(Integer o1,Integer o2) {
return o2-o1;
}
}