杭电oj 1052田忌赛马问题

http://acm.hdu.edu.cn/showproblem.php?pid=1052

问题描述

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

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

“田和国王都拥有三匹不同级别的赛马,分别是常规赛,加赛和超级赛。规则是每场比赛要进行三轮比赛;每匹马都必须使用一轮。单打冠军 回合从失败者那里拿走了两百银元。”

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

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

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

如果田吉生活在当今,他一定会嘲笑自己。 更重要的是,如果他现在正参加ACM竞赛,他可能会发现赛马问题可以简单地看作是在二分图中找到最大匹配项。 一侧画田的马,另一侧画国王的马。 只要Tian的一匹马能击败国王的一匹,我们就会在它们之间划出一条优势,这意味着我们希望建立这对。 然后,赢得尽可能多的回合的问题仅仅是在此图中找到最大匹配。 如果存在平局,问题变得更加复杂,他需要为所有可能的边分配权重0、1或-1,并找到最大加权的完美匹配... 但是,赛马问题是二分匹配的一种非常特殊的情况。 该图由马的速度决定-较高速度的顶点总是比较低速度的顶点好。 在这种情况下,加权二分匹配算法是解决该问题的过于先进的工具。 在这个问题中,要求您编写一个程序来解决这种特殊的匹配问题。

输入项

输入最多包含50个测试用例。 每种情况在第一行以正整数n(n <= 1000)开头,这是每一侧的马数。 第二行中的后n个整数是田马的速度。 然后,第三行的下n个整数是国王的马匹速度。 输入的最后一行在最后一个测试用例之后以0结束。

输出量

对于每种输入情况,输出包含单个数字的行,这是Tian Ji将获得的最大金额(以银元为单位)。

样本输入

3 92 83 71 95 87 74 2 20 20 20 20 2 20 19 22 18 0

样本输出

200 0 0

问题分析

这是一道很经典的贪心算法入门题。 这道题贪心的思想是 要把每一匹马的作用发挥到最大,把已方赢的概率增加到最大

我是从双方慢马的角度来分析的,其实快马和慢马的思路差不多。

用田忌最慢的马与王最慢的马相比较

  1. 如果田忌的慢马比王的慢马要快

    果断把先用田忌的慢马先赢一把(这样赢是代价最小的)

  2. 如果田忌的慢马比王的慢马要慢

    果断把这匹慢马与王最快的马比赛(因为反正都要输,这样我输的价值更大,因为我把最快的马比下去了,可以增加后面其他马赢的机会)

  3. 如果田忌的慢马与王的慢马速度一样

    1. 拿田忌最快的马和王最快的马比较

      1. 如果田忌快马比王快马快,那就拿这匹快马赢一局,之所以需要判断是因为我想让我最慢的马收益更大,如果我的快马比王的快马快就没必要让慢马和这匹快马比了,我可以直接赢一盘。然后让我最慢的马去和王的一匹比我剩下所有的马都要快的马比赛,这样我的慢马收益才是最大的。

      2. 如果田忌快马比王快马慢,那就拿田忌最慢的马与王最快的马比赛,这样的话我可以增加已方后面的马赢的概率,因为你把最快的马拉走了。

AC代码如下。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 用来把马排序,速度由低到高
double cmp(double a, double b){
    return a < b;
};

int main(){
    int N;
    while(cin>>N && N != 0){
        vector<double> tj_horses;
        vector<double> king_horse;
        for(int i = 0;i < N; i++){
            double temp;
            cin>>temp;
            tj_horses.push_back(temp);
        }
        for(int i = 0;i < N; i++){
            double temp;
            cin>>temp;
            king_horse.push_back(temp);
        }
        // 排序田忌和王的马
        sort(tj_horses.begin(), tj_horses.end(), cmp);
        sort(king_horse.begin(), king_horse.end(), cmp);
        // 下面四个变量用来记录当前田忌和王最快的马和最慢的马的位置。左边为慢马,右边为快马
        int king_left_index = 0;
        int king_right_index = N - 1;
        int tj_left_index = 0;
        int tj_right_index = N - 1;
        int tj_money = 0;
        for(int i = 0; i < N; i++){
            // 如果田忌的慢马比王的慢马快,就先赢一局
            if(tj_horses[tj_left_index] > king_horse[king_left_index]){
                tj_money+=200;
                king_left_index++;
                tj_left_index++;
            }
            // 如果田忌的慢马与王的慢马一样快
            else if(tj_horses[tj_left_index] == king_horse[king_left_index]){
                // 如果田忌的快马比王的快马快,就赢一局
                if(tj_horses[tj_right_index] > king_horse[king_right_index]){
                    tj_money+=200;
                    tj_right_index--;
                    king_right_index--;
                }
                // 如果田忌的快马比王的快马慢,就输一局用田忌的慢马把王的快马比下去
                else{
                    tj_horses[tj_left_index] < king_horse[king_right_index] ? tj_money-=200 : tj_money = tj_money;
                    tj_left_index++;
                    king_right_index--;
                }
            }
            // 如果田忌的慢马比王的慢马慢,就输一局,把王最快的马比下去
            else if(tj_horses[tj_left_index] < king_horse[king_left_index]){
                tj_money-=200;
                tj_left_index++;
                king_right_index--;
            }
        }
        cout<<tj_money<<endl;
    }
    return -1;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 郭相麟 当泪水挂满脸旁 看着你远去的背影 美丽的哀愁 随着泪水而悄然滑落 你怎么舍得我难过 所谓的付出 已成为心累...
    郭相麟阅读 188评论 0 0
  • 你是一棵翠藤 缠绕着梦之树 几多星夜里 我被你思念的拥抱 ――窒息
    竹林奇光阅读 425评论 3 21