java60分MLE和TLE
查看原帖
java60分MLE和TLE
798365
KanoDaisukiii楼主2024/2/25 01:08

用cpp写就过了,但是用java会超时超内存,请问有什么优化的方法吗

import java.util.Arrays;
import java.util.Scanner;

// 1:无需package
// 2: 类名必须Main, 不可修改

class Com implements Comparable{
	int num;//选手编号
	int score;//选手分数
	public int compareTo(Object o) {//便于用sort排序
		Com c=(Com) o;
		if(this.score>c.score) {
			return -1;
		}else if(this.score==c.score) {
			return this.num-c.num;
		}else {
			return 1;
		}
	}
}
public class Main {
	public static void Merge(Com []C1,Com []win,Com []lose,int p1,int p2) {//归并排序
		int i,j,k;
		for(i=0,j=0,k=0;i<p1&&j<p2;k++) {
			if(win[i].score>lose[j].score) {
				C1[k]=win[i];
				i++;
			}else if(win[i].score==lose[j].score) {
				if(win[i].num<lose[j].num) {
					C1[k]=win[i];
					i++;
				}else {
					C1[k]=lose[j];
					j++;
				}
			}else {
				C1[k]=lose[j];
				j++;
			}
		}
		while(i<p1) {
			C1[k]=win[i];
			i++;
			k++;
		}
		while(j<p2) {
			C1[k]=lose[j];
			j++;
			k++;
		}
	}
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n=scan.nextInt(),r=scan.nextInt(),q=scan.nextInt();
        Com []C1=new Com[2*n];
        Com []win=new Com[n];//赢的选手
        Com []lose=new Com[n];//输的选手
        int []ability=new int[2*n];//选手的能力值
        int p1=0;
        int p2=0;
        for(int i=0;i<2*n;i++) {
        	C1[i]=new Com();
        	C1[i].num=i;
        	C1[i].score=scan.nextInt();
        }
        for(int i=0;i<n;i++) {
        	win[i]=new Com();
        	lose[i]=new Com();
        }
        for(int i=0;i<2*n;i++) {
        	ability[i]=scan.nextInt();
        }
        Arrays.sort(C1, 0, 2*n);//第一遍直接sort
        for(int i=0;i<r;i++) {//比赛
        	for(int k=1;k<2*n;k+=2) {
        		if(ability[C1[k].num]>ability[C1[k-1].num]) {
        			C1[k].score++;//赢了加分并添加入赢者队列
        			win[p1]=C1[k];
        			p1++;
        			lose[p2]=C1[k-1];
        			p2++;
        		}else {
        			C1[k-1].score++;
        			win[p1]=C1[k-1];
        			p1++;
        			lose[p2]=C1[k];
        			p2++;
        		}
        	}
        	Merge(C1,win,lose,p1,p2);//归并排序
        	p1=0;
        	p2=0;
        }
        System.out.println(C1[q-1].num+1);
        scan.close();
    }
}
2024/2/25 01:08
加载中...