洛谷P1786(Java题解)帮贡排序

package 洛谷P1786;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class P1786 {

//难在难在你要想到用两次排序,第一次先把下面得人按照钱来拍,然后再细分钱的
//看上去只是一个简单的模拟,但其实还是有很多细节的
	
	public static class ren{ 
	    String name;
		String status;
		int money;
		int rank;
		int num;
		 ren(String name, String status, int money, int rank, int num) {
			super();
			this.name = name;
			this.status = status;
			this.money = money;
			this.rank = rank;
			this.num = num;
		}
		
	}

	//现在就有个问题第二次排序比地位怎么排序,所以我们要把地位转化成数字,这样就可以成功排了
	public static int transform(String a)
	{
		if (a=="BangZhu") return 0;
		else if (a=="FuBangZhu") return 1;
		else if (a=="HuFa") return 2;
		else if (a=="ZhangLao") return 3;
		else if (a=="TangZhu") return 4;
		else if (a=="JingYing") return 5;
		else return 6;
	}
	public  static class compare implements Comparator<ren>{

		@Override
		public int compare(ren o1, ren o2) {
			if(o1.money==o2.money)return o1.num-o2.num;//序号降序
			else return o2.money-o1.money;//钱降序
		}
		
	}
	//如果等级相等职位相等,那么按照先来后到的原则排
	//如果职位相等等级不相等,那么按照等级排
	//最后按职位来排
	public  static class compare2 implements Comparator<ren>{

		@Override
		public int compare(ren o1, ren o2) {
			if(transform(o1.status)==transform(o2.status)) 
			{
				if(o1.rank==o2.rank)return o1.num-o2.num;
				return o2.rank-o1.rank;
			}
			else return transform(o1.status)-transform(o2.status);
		}
		
	}
		public static void main(String[] args)  {
			Scanner in=new Scanner(System.in);
			int n=in.nextInt();
			
			ren r[]=new ren[n];		
			for(int i=0;i<n;i++)
			{	
				String name1=in.next();
				String status2=in.next();
				int mone1=in.nextInt();
				int rank1=in.nextInt();
				int num1=i;
				r[i]=new ren(name1,status2,mone1,rank1,num1);
				
			}
	    Arrays.sort(r,3,n,new compare());//先把除了帮主和副帮主的人按照钱升序排序
	    //这时候除了那三个傻逼以外都是钱来排的咯,那么现在给他们搞地位好吧
	    for(int i=0;i<n;i++)
	    {
	    	if (i==0) r[i].status="BangZhu";
			else if (i==1||i==2) r[i].status="FuBangZhu";
			else if (i==3||i==4) r[i].status="HuFa";
			else if (i>=5&&i<=8) r[i].status="ZhangLao";
			else if (i>=9&&i<=15) r[i].status="TangZhu";
			else if (i>=16&&i<=40) r[i].status="JingYing";
			else r[i].status="BangZhong";
	    }
	    Arrays.sort(r,0,n,new compare2());
	    for(int i=0;i<n;i++)
	    {
	    	System.out.print(r[i].name+" "+r[i].status+" "+r[i].rank);
	    	System.out.println();
	    }
	   }
	}

详细请看注释,主要难在思维上

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值