P3887 [GDOI2014]世界盃(排序,優先隊列,洛谷,java)

洛谷鏈接: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;
	}
}	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章