链接:click here~~
题意:
田忌和齐王各有N匹马,判断怎样比赛,使田忌净胜场数最多。
之前无意看到强哥写的题解(很早就做了~~囧)感觉很有意思,但是当时忘了去A 了,现在回想起来此题很是经典了,意犹未尽的感觉,直接复制题解了,思路写的很清楚了,
基本就是看着思路敲的
【解题思路】不管怎么比赛,都要让田忌的马发挥最大价值。当然,马的第一要务是用来赢得比赛,而且要最大效益的赢,也就是要赢对方仅次于自己的马。
当他不能完成这个任务的时候就要去输,并拉对方最快的马下水,给自己后面的队友创造更大的胜利机会。
1.若田忌最慢的马可以战胜齐王最慢的马,那么就让它战胜那匹慢马,胜利场次加1。(田忌最慢马 > 齐王最慢马)
2.若田忌最慢的马不能战胜齐王最慢的马,那么它更加不能战胜其他的马,那就让它输,而且输给齐王最快马,失败场次加1。(田忌最慢马 < 齐王最快马)
3.若田忌最慢的马与齐王最慢的马速度相等。此时,不能简单地认为与它打成平手就是最好情况,相反,打平是下下策,为什么呢?
因为自己后面的队友很有可能战胜此时对方的这匹慢马,所以就算自己输一场,队友也能帮忙赢回一场,而胜一场,输一场的收益和打平一场的收益是一样的,而且自己输的时候可以拉对方最快的马下水,给己方最快的马创造更大的胜利机会(因为它失去了一个强劲的对手),也就是说己方最快的马很可能因为自己的牺牲再胜利一场,从这个角度看,还是自己故意输掉比较好。
但是,还有一点需要注意,当自己放水前,如果己方最快的马原本就比对方最快的马快,然后还输给对方最快的马,那么己方最快的马的才华就浪费了,为什么?
很简单,它原本就能赢,需要你放水么?- -!换句话说,这种情况下,自己的牺牲没有一点价值。
所以,在放水时,一定要保证己方最快马不快于对方最快马。满足此条件后,让己方最慢马与对方最快马去比赛(有可能平局),这样,田忌的马就得到了充分的利用。
总结来说:
/*
1田忌最慢马 > 齐王最慢马
2田忌最慢马 < 齐王最快马
3田忌最慢马==齐王最慢马,与齐王最快马比
4保证己方最快马不快于对方最快马,输掉最慢马
*/
代码:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int maxn=1005; int tianji[maxn],King[maxn]; int n,win,lose; void solve() { win=lose=0; int t_slow=0,t_fast=n-1; int K_slow=0,K_fast=n-1; while(t_slow<=t_fast) { if(tianji[t_slow]>King[K_slow]) { win++; t_slow++; K_slow++; } else if(tianji[t_slow]<King[K_slow]) { lose++; t_slow++; K_fast--; } else { if(tianji[t_fast]>King[K_fast]) { win++; t_fast--; K_fast--; } else { if(tianji[t_slow]<King[K_fast]) lose++; t_slow++; K_fast--; } } } } int main() { while(scanf("%d",&n),n) { for(int i=0; i<n; i++) scanf("%d",&tianji[i]); for(int i=0; i<n; i++) scanf("%d",&King[i]); sort(tianji,tianji+n); sort(King,King+n); solve(); printf("%d\n",(win-lose)*200); } return 0; }
【贪心专题】HDU 1052 Tian Ji -- The Horse Racing (田忌赛马)
原文地址:http://blog.csdn.net/u013050857/article/details/44920051