hsu 1052贪心(java)

这篇博客介绍了如何使用贪心策略解决田忌赛马问题。通过确保田忌的快马对战齐王的快马,或者田忌的慢马对战齐王的更慢马,来提高胜率。作者提到了最初的排序和遍历思路导致错误,并指出贪心算法在JAVA实现中的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比较好的一个贪心题目。
题目:田忌赛马
思路:
采用的贪心策略是:
1、田忌的快马比齐王的快,直接比掉。
2、若快马没有快,拿田忌最慢的和齐王最慢的比较,若快直接比掉。
3、若慢马比齐王慢,就拿田忌最慢的和齐王最快的比较。

(原来的思路是对两个数组排序,遍历国王的马,只要找到一个大于他的就加一。。。。结果WA,原谅还怎么会用贪心,用JAVA写太麻烦了)

import java.util.*;
/*
 * 贪心策略
 * 1、田忌的快马比齐王的快,直接比掉。
 * 2、若快马没有快,拿田忌最慢的和齐王最慢的比较,若快直接比掉。
 * 3、若慢马比齐王慢,就拿田忌最慢的和齐王最快的比较。
 * 
 * */
public class Main {
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        int n;
        int qquick,tquick,qslow,tslow;
        long[] T = new long[1001];
        long[] Q = new long[1001];

        while(true)
        {
            int money = 0;
            int eq = 0;
            n = in.nextInt();
            if(n == 0) break;

            for(int i=0; i<n; i++)
            {
                T[i] = in.nextLong();
            }
            for(int i=0; i<n; i++)
                Q[i] = in.nextLong();

            insertSort(T,n);
            insertSort(Q,n);

            int j=n-1, k=0, l=n-1, m=0;
            while(j>=k)
            {
                if(T[j]>Q[l])//最快的和最快的比较
                {
                    j--;
                    l--;
                    money+=200;
                }
                else if(T[j]<Q[l]){
                    k++;
                    l--;
                    money -= 200;
                }
                else if(T[k]>Q[m]){//最慢的和最慢的比较
                    k++;
                    m++;
                    money += 200;
                }
                else{
                    if(T[k]<Q[l])//最慢的和最快的比较
                        money -= 200;
                    k++;
                    l--;
                }
            }

            System.out.println(money);
        }
    }
    public static void insertSort(long[] a,int nElems)
    {
        int in,out;

        for(out=1; out<nElems; out++)
        {
            long temp = a[out];
            in = out;
            while(in>0 && a[in-1] >= temp)
            {
                a[in] = a[in-1];
                --in;
            }
            a[in] = temp;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值