贪心算法 田忌赛马(problem C)

题意:这是田忌赛马的故事,首先可以将田忌和国王的马的速度从快到慢排列,然后进行比较。每比一次两边各减去一匹马,用四个标记分别标记田忌和国王的最快、最慢马。先比较他们最快的马,若相等,再比较最慢的马,考虑一下条件和其他因素就可以了。


#include"stdio.h"

#include"algorithm"
using namespace std;
const int N=1010;
int tian[N];
int king[N];
int cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int n,i;
    while(scanf("%d",&n)&&n)
    {
        for(i=0;i<n;i++)
            scanf("%d",&tian[i]);
        for(i=0;i<n;i++)
            scanf("%d",&king[i]);
        sort(tian,tian+n,cmp);
        sort(king,king+n,cmp);
        int tfirst=0,kfirst=0,tlast=n-1,klast=n-1;
        int counta=0;
        for(i=0;i<n;i++)
        {
            if(tian[tfirst]>king[kfirst])
            {
                tfirst++;
                kfirst++;
                counta++;
            }
            else if(tian[tfirst]<king[kfirst])
            {
                tlast--;
                kfirst++;
                counta--;
            }
            else
            {
                if(tian[tlast]>king[klast])
                {
                    tlast--;
                    klast--;
                    counta++;
                }
                else if(tian[tlast]<king[klast])
                {
                    tlast--;
                    kfirst++;
                    counta--;
                }
                else
                {
                    if(tian[tlast]<king[kfirst])
                    {
                        tlast--;
                        kfirst++;
                        counta--;
                    }
                }
            }
        }
        printf("%d\n",counta*200);
    }
    return 0;
}
### 关于 PAT 考试中的田忌赛马问题 #### 田忌赛马问题描述 田忌赛马是一个经典的贪心算法题目,在这个问题中,给定了两组数据分别代表齐王和田忌的马的速度。比赛规则是双方各派出一匹马来进行一对一的比赛,胜利者得一分。目标是在已知对方马匹速度的情况下,通过合理的安排己方马匹出场顺序来获得尽可能多的分数。 #### 解题思路分析 对于此类问题可以采用如下策略: - 将两个数组按照从大到小排序。 - 使用双指针方法比较两端的最大值或最小值来进行匹配决策。 - 如果当前最强的对手能赢,则让最弱的一匹去送死;如果不能赢,则用自己最强的一匹对抗之。 这种方法能够保证每次都能做出局部最优的选择从而达到全局最优的效果[^1]。 #### Python 示例代码实现 下面给出一段基于上述思想编写的Python程序用于模拟该过程: ```python def horse_racing(tian, wang): tian.sort(reverse=True) wang.sort(reverse=True) score = 0 while tian and wang: if tian[-1] > wang[-1]: # 当田忌最快的马比齐王最快还快时,派这匹马上场赢得这一局 score += 1 tian.pop() wang.pop() elif tian[0] < wang[0]: # 否则,当田忌最慢的马输给齐王最慢的时候, # 让它上场输掉这一轮保存实力更强的马 tian.pop(0) wang.pop() else: break return score if __name__ == "__main__": n = int(input()) tian = list(map(int, input().split())) wang = list(map(int, input().split())) result = horse_racing(tian[:], wang[:]) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值