hdoj1052

Tian Ji -- The Horse Racing

解题思路:贪心算法。根本思想是要让田忌花最小的代价来胜一每一场,让齐王花最大的代价来胜每一场。(“代价”可以用比较的两匹马的权值之差来形象地表示)
首先将两人的马排序。
然后讨论两者最强的马的三种情形:
1.田忌的马胜于齐王的马
这时田忌的这匹马是所有马中最强的,它必胜,但与谁比对田忌最有利呢?与齐王最强的比,这样使得齐王损失最大(他拿自己最强的马去输了一场比赛)。
2.田忌的马劣于齐王的马

这时齐王的马是最强的,田忌让谁去败给它呢?最劣的那匹。这时齐王的“代价”最大。

3.二者的马势均力敌

这时如果田忌最劣的马是所有中最劣的,就让它跟齐王最强的比较(这时对于田忌的这匹劣马来说并不会比其它的情形坏,因为它注定要输的,而对于田忌的最强的马来说,这个情形也不会比其它的情形差,因为它可能这时会成为所有马中最强者),如果田忌最劣的马不是最劣的,(那就创造条件使这情况满足),说明这匹马强于齐王最劣的,那就让它们比较,田忌胜出,这时双方次劣的马成了最劣的,再看田忌的最劣的马是不是所有中最劣的,还不是?再比较,直到满足为止。

不停地对二者最强的马进行讨论比较,最终所有的马都比过,算法结束。


|code--------------------------------------------------------------------------------------------------+

|001| /***************************************************************\                              

|002|  *Author: 小呼                                                                               

|003|  *Created Time: Fri 09 Jul 2010 03:28:42 PM CST                                                

|004|  *File Name: main.cpp                                                                          

|005|  *Description:贪心算法                                                                     

|006| \***************************************************************/                              

|007| //*========================*Head File*========================*\\                              

|008|                                                                                                

|009| #include<stdio.h>                                                                              

|010| #include<stdlib.h>                                                                             

|011| /*----------------------*Global Variable*----------------------*/                              

|012| int n,K[1001],T[1001];                                                                         

|013| //*=======================*Main Program*=======================*//                             

|014| using namespace std;                                                                           

|015|                                                                                                

|016| int cmp(const void* a,const void* b){                                                          

|017| .       return *(int*)b-*(int*)a;                                                              

|018| }                                                                                              

|019| int main(){                                                                                    

|020| .       //freopen("input","r",stdin);                                                          

|021| .       while(scanf("%d",&n)!=EOF&&n){                                                         

|022| .       .       for(int i=0;i<n;++i)                                                           

|023| .       .         scanf("%d",T+i);                                                             

|024| .       .       for(int i=0;i<n;++i)                                                           

|025| .       .         scanf("%d",K+i);                                                             

|026| .       .       qsort(T,n,sizeof(int),cmp);//排序                                            

|027| .       .       qsort(K,n,sizeof(int),cmp);//排序                                            

|028| .       .       int win;//田忌比齐王多胜出的次数                                    

|029| .       .       int t_h=0,t_t=n-1,k_h=0,k_t=n-1;//两个队列的队头和队尾               

|030| .       .       while(t_h<=t_t){//队不空                                                    

|031| .       .       .       if(T[t_h]>K[k_h]){//田忌最强的马胜过齐王最强的马         

|032| .       .       .       .       win++;                                                         

|033| .       .       .       .       t_h++;                                                         

|034| .       .       .       .       k_h++;                                                         

|035| .       .       .       }                                                                      

|036| .       .       .       else if(T[t_h]<K[k_h]){//田忌最强的马劣于齐王最强的马    

|037| .       .       .       .       win--;                                                         

|038| .       .       .       .       k_h++;                                                         

|039| .       .       .       .       t_t--;                                                         

|040| .       .       .       }                                                                      

|041| .       .       .       else{//两者最强的马势均力敌                                  

|042| .       .       .       .       while(t_h<=t_t&&k_h<=k_t&&T[t_t]>K[k_t]){//田忌最弱的马胜过齐王最弱的马

|043| .       .       .       .       .       win++;                                                 

|044| .       .       .       .       .       t_t--;                                                 

|045| .       .       .       .       .       k_t--;                                                 

|046| .       .       .       .       }                                                              

|047| .       .       .       .       if(T[t_t]<K[k_h])//田忌最弱的马劣于最强的马        

|048| .       .       .       .         win--;                                                       

|049| .       .       .       .       k_h++;                                                         

|050| .       .       .       .       t_t--;                                                         

|051| .       .       .       }                                                                      

|052| .       .       .       if(T[t_t]>K[k_h]){                                                     

|053| .       .       .       .       flag=1;                                                        

|054| .       .       .       .       break;                                                         

|055| .       .       .       }                                                                      

|056| .       .       }                                                                              

|057| .       .       if(flag)                                                                       

|058| .       .         win+=t_t-t_h+1;                                                              

|059| .       .       printf("%d\n",win*200);                                                        

|060| .       }                                                                                      

|061| }                                                                                              

end+--------------------------------------------------------------------------------------------------+

感谢pennyshe的解题报告。


你可能感兴趣的:(OJ)