[HDU1052]Tian Ji -- The Horse Racing[贪心]

题目链接:[HDU1052]Tian Ji -- The Horse Racing[贪心]

题意分析:国王和田忌赛马,如果田忌胜利则他将得200银元,如果失败则失去200银元,如果平手,那么一毛也得不到XD。问:怎样使田忌得到的银元最多?

解题思路:首先对两人的赛马进行按速度从小到大排序。从田忌的第一匹马开始,如果这匹马注定失败,那么让这匹马与国王最厉害的马去比赛;如果这匹马并不是注定失败(还是能赢与之相对的那匹马的),那么就让他们比赛;如果这匹马和相对的那匹马一样厉害,那么就从末尾开始比较赛马,这种情况具体看代码:D。

个人感受:思路要清晰!!否则下次还是WA。TAT

具体代码如下:

#include <iostream>
#include <algorithm>
using namespace std;

int tian[1010], king[1010];//tian = 田忌之马,king = 国王之马

int main() {
    ios_base::sync_with_stdio(0);
    int n;
    while (cin >> n && n)
    {
        for (int i = 0; i < n; ++i) cin >> tian[i];
        for (int i = 0; i < n; ++i) cin >> king[i];
        sort(tian, tian + n);
        sort(king, king + n);
        int ans = 0, ts = 0, ks = 0, te = n - 1, ke = n - 1; //ts,te 田忌的剩余马匹队列的头尾;ks,ke国王马匹队列的头尾;
        while (ts <= te)
        {
            if (tian[ts] < king[ks]) //该马小于与之对应的马,那么就把它与国王末尾的那匹马对战(反正都是输,要输的光荣XD)
            {
                --ans; ++ts; --ke;
            }
            else if (tian[ts] == king[ks])//如果平手
            {
                if (tian[te] > king[ke]) //末尾马大于国王末尾马,不用说,肯定比
                {
                    --te; --ke; ++ans;
                }
                else
                {
                    if (tian[ts] < king[ke])//如果末尾马比不过国王,这时让那匹弱马来比较才是最优的选择
                        --ans;
                    --ke; ++ts;
                }
            }
            else //如果能胜过
            {
                ++ans; ++ts; ++ks;
            }
        }
        cout << ans * 200 << '\n';
    }
    return 0;
}

你可能感兴趣的:(HDU,贪心)