import java.util.Scanner;
import java.util.Arrays;
public class Main
{
private int[] tian;
private int[] king;
private int n;
private int m; //田劲赢的钱
Main( int n )
{
this.tian = new int[n];
this.king = new int[n];
this.n = n;
this.m = 0;
}
public void setT( int i,int a )
{
this.tian[i] = a;
}
public void setK( int i,int b )
{
this.king[i] = b;
}
public void sort()
{
Arrays.sort( this.tian );
Arrays.sort( this.king );
}
public void setM()
{
int[] c = new int[n];
for( int i=0;i<n;i++ )
{
c[i] = 0;
}
int j=0; //j指的是国王还没比的马里面最差的
int k=this.n-1; //k指的是国王还没比的马里面最好的
int l=this.n-1; //l指的是田忌目前好的马
for( int i=0;i<=l; )
{
if( tian[i]<king[j] ) //田忌的马比不上国王的马,就让那匹烂的马去对抗国王最好的马
{
m--;
k--;
i++;
}
else
{
if( tian[i]==king[j] ) //2匹马能力相同的情况下,这里比较蛋疼
{
if( tian[l]>king[k] ) //如果田忌最好的马的能力比国王的马好,就把田忌最好的马去和国王最好的马比赛,烂的马先别比赛
{
m++;
l--;
k--;
}
else
{
if( tian[i]<king[k] ) //如果田忌最好的马比不上国王最好的马,就让田忌最差的马去和国王最好的马比赛
{
m--;
i++;
k--;
}
else //这里是最极端的一种可能,在国王和田忌都剩下最后一匹马比赛,并且这两匹马打和的时候,这样做可以结束循环。
{ //这里跟网上的有点不同吧,是我个人的意见,或者我想错了,大家有什么见解,都可以提出来。
i++;
k--;
}
}
}
else
{
if( tian[i]>king[j] ) //田忌的马比国王的马,直接秒杀
{
m++;
j++;
i++;
}
}
}
}
}
public void prM()
{
System.out.println( this.m*200 );
}
public static void main(String[] args)
{
int n;
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
int a;
while( n!=0 )
{
Main m = new Main( n );
for( int i=0;i<n;i++ )
{
a = cin.nextInt();
m.setT( i,a );
}
for( int i=0;i<n;i++ )
{
a = cin.nextInt();
m.setK( i,a );
}
m.sort();
m.setM();
m.prM();
n = cin.nextInt();
}
}
}
先发下代码吧。
始终要参考网上大神的代码,才能够。真够水的。
先说一下这道题目的思路吧。
这道题目,要做到:
1、如果田忌的某匹马相对于国王的马来说,是差的。那么它的最大价值化的方法是在拿它去和国王相对最好的马PK时,反正都是输嘛。
2、如果田忌的某匹马相对于国王的马来说,是好的。那么它的最大价值化的方法是在拿它去和国王的相对最好的马PK并且能胜利的时候,搞定最强的,给下面的小弟更多的机会。
3、如果田忌的某匹马相对于国王的马来说,是打和的。那么当田忌目前最好的马和国王目前最好的马PK,并且田忌的马取得胜利时,就让田忌最好的马去PK国王最好的马。如果田忌不能胜利的时候,就拿田忌打平的马去和国王最好的马PK,然后,就搞掉了最好的马。(有一点要注意,在这么搞的时候,如果到最后剩一匹马,并且打平的时候,要注意能够结束循环。 纯属个人意见,不喜勿喷。。。。)
这就是主要的解题思路和思想,貌似就是贪心算法吧。
我觉得我个人在寻找这种思路和归纳这种思路的能力很差,以后要好好提高啊。。。。。