NYOJ 364 田忌赛马

题意:
田忌和齐王各有N匹马,判断怎样比赛,使田忌净胜场数最多。


我感觉这题的精髓就是,不管怎么比赛,都要让田忌的马发挥最大价值。
当然,马的第一要务是用来赢得比赛,而且要最大效益的赢,也就是要赢对方仅次于自己的马。
当他不能完成这个任务的时候就要去输,并拉对方最快的马下水,给自己后面的队友创造更大的胜利机会。

1.慢马可以赢就让它赢,赢不了就拉国王的快马下水

2.慢慢平手,绝对不要以为平手就可以了,因为如果后面的队友可以赢king的这马,自己输和平手结果一样,但是自己还可以拖一匹快马下水
3.还有就是不要乱防水 如果我方快马可以赢对面快马 就不必要牺牲了 不要浪费自己方快马的才华 平手不输硬币

(两个标记 一个头 一个尾 分3中情况考虑)

#include<stdio.h>
#include<algorithm>
using namespace std;
int t[1005],k[1005],win,lose;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            scanf("%d",&t[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&k[i]);
        sort(t,t+n);
        sort(k,k+n);
        win=lose=0;
        int t_slow=0,k_slow=0;
        int t_quick=n-1,k_quick=n-1;
        while(t_slow<=t_quick)
        {
            if(t[t_slow]>k[k_slow])   //t慢马可以赢king的情况            {
               {
                    win++;
                    t_slow++;
                    k_slow++;
               }
            else if(t[t_slow]<k[k_slow])//慢马pk不应king 那么就让他输 并且拉king的快马下水
                {
                lose++;
                t_slow++;
                k_quick--;
                }
            else//和的情况
                {
                    if(t[t_quick]>k[k_quick])//放水前的决断
                    {
                        win++;
                        t_quick--;
                        k_quick--;
                    }
                    else
                    {

                       if(t[t_slow]<k[k_quick])//不虚
                            lose++;
                        t_slow++;
                        k_quick--;
                    }
                }
        }
        printf("%d\n",(win-lose)*200);
    }
    return 0;
}


你可能感兴趣的:(算法,nyoj)