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的解题报告。

posted @ 2010-07-09 19:15  open source  阅读(434)  评论(0编辑  收藏  举报