POJ 2287 田忌赛马(贪心)

本文深入解析了POJ2287题目——田忌赛马的贪心算法解决方案,通过分析双方各具战斗力的马匹对决场景,阐述了如何利用贪心策略实现利益最大化,即在对战中尽可能赢得更多场次的方法。

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

1. 题目

1.1 题目链接

http://poj.org/problem?id=2287

1.2 题目大意

双方各有n匹战斗力各异的马,分别派出来PK,假设对方先出牌,我方后出,求我方最多能胜几场

1.3 解题思路

  • 对方出来战斗力k的马
  • 我方派出战斗力比k大的且最弱的马,赢,保存实力更高的马
  • 若均无法战胜对方,派出最弱的马,让你赢个最弱的,保存实力

2. Accepted 代码

在这里插入图片描述

/**
 * @description: poj2287田忌赛马(贪心)
 * @author: michael ming
 * @date: 2019/7/2 23:55
 * @modified by: 
 */
#include <iostream>
#include <algorithm>
using namespace std;
bool comp(int a, int b)
{
    return a > b;
}
int main()
{
    int i, j, iend, jend, n, money;
    int tianji[1001], king[1001];
    while(cin >> n && n != 0)
    {
        for(i = 0; i < n; ++i)
            cin >> tianji[i];
        for(j = 0; j < n; ++j)
            cin >> king[j];
        sort(tianji, tianji+n, comp);//从大到小排序
        sort(king, king+n, comp);//从大到小排序
        i = j = 0;
        iend = jend = n-1;
        money = 0;
        while(i <= iend)
        {
            if(tianji[i] > king[j])
            //我方能打赢所有的,那么我就打掉一个最厉害的
            {
                money += 200;
                i++,j++;
            }
            else if(tianji[i] < king[j])
            //我方最大的都比别人小,让最弱的出战
            {
                money -= 200;
                iend--,j++;
            }
            else//两边最厉害的一样
            {
                if(tianji[iend] > king[jend])
                //最弱的马都能打败你的最弱马,那就用最小实力的
                {
                    money += 200;
                    iend--,jend--;
                }
                else if(tianji[iend] < king[jend])
                //我最弱的马没有胜算,让给你最强的马吃掉
                {
                    money -= 200;
                    iend--,j++;
                }
                else//两边最厉害的,和最弱的都一样,
                {
                    if(tianji[iend] < king[j])
                        money -= 200;//我最弱的给你最强的吃掉
                    iend--,j++;
                    //如果tianji[iend] == king[j]
                    //说明剩余两边的马全部相等,打平,金钱不变,下标挪一下
                }
            }
        }
        cout << money << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值