杭电oj 1052 java实现

#杭电oj 1052 java

Tian Ji – The Horse Racing

这是中国历史上的一个著名故事。

“那是大约2300年前。田吉将军是齐国的一位高级官员。他喜欢与国王和其他人打赛马。” 

“田和国王都拥有三匹不同级别的马,分别是普通,加号和超级。规则是每场比赛要进行三轮比赛;每匹马都必须使用一轮。获胜者一轮从失败者手中夺走了两百银元。” 

“作为国家最有权力的人,国王的马匹非常好,以至于每班他的马匹都比田纳西人好。结果,国王每次从田纳西那里拿走六百块银元。”

“田吉对此感到不满,直到他遇到了中国历史上最著名的将军之一孙斌。由于孙先生的小把戏,田吉在下一场比赛中带回家了两百银元和如此的恩典。 ” 

“这是一个相当简单的把戏。使用他的普通级赛马对抗国王的超级类,他们肯定会输掉这一回合。但是,他的加值击败了国王的常规者,而他的超级级也击败了国王的加成。这是一个简单的窍门那么您如何看待中国的高级官员田吉?”



如果田吉生活在当今,他一定会嘲笑自己。更重要的是,如果他现在正参加ACM竞赛,他可能会发现赛马问题可以简单地看作是在二部图中找到最大匹配项。在一侧画田的马,在另一侧画国王的马。只要Tian的一匹马能击败国王的一匹马,我们就会在它们之间画一条边缘,这意味着我们希望建立这对。然后,赢得尽可能多的回合的问题仅仅是在此图中找到最大的匹配项。如果存在平局,问题变得更加复杂,他需要为所有可能的边分配权重0、1或-1,并找到最大加权的完美匹配...

![田忌赛马](https://img-blog.csdnimg.cn/20210328162244986.gif#pic_center)


但是,赛马问题是二分匹配的一种非常特殊的情况。该图由马的速度决定-较高速度的顶点总是击败较低速度的顶点。在这种情况下,加权二分匹配算法是解决该问题的过于先进的工具。

在这个问题中,要求您编写一个程序来解决这种特殊的匹配问题。
import java.util.Arrays;
import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()) {
			int n=sc.nextInt();
			if(n==0) { 
				break;
			}
			int[] t=new int[n];//田忌的马
			int[] k=new int[n];//齐王的马
			for (int i = 0; i < n; i++) {
				t[i]=sc.nextInt();
			}
			for (int i = 0; i < n; i++) {
				k[i]=sc.nextInt();
			}
			Arrays.sort(t);
			Arrays.sort(k);
			int t_max=n-1,t_min=0;
			int k_max=n-1,k_min=0;
			int win_num=0;
			while(t_min<=t_max&&k_min<=k_max) {
					if(t[t_max]>k[k_max]) {
						//当田忌最快的马比齐王最快的马快时,赢一场先。
						win_num++;
						t_max--;
						k_max--;
					}else if(t[t_max]<k[k_max]){
						//当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场。
						win_num--;
						t_min++;
						k_max--;
					}else if(t[t_min]>k[k_min]){
						//当田忌最慢的马比齐王最慢的马快,赢一场先
						win_num++;
						t_min++;
						k_min++;
					}else {
						//当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场
						if(t[t_min]<k[k_max]){
							win_num--;
					}
						t_min++;
						k_max--;
				}
			}
			System.out.println(win_num*200);
		}
	}	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值