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

  • 相关阅读:
    HDU 3729【二分匹配】
    51nod 1456【强连通,缩点,并查集】
    51nod1459【二级最短路】
    51nod1640 【最小生成树】
    CodeForces660B【模拟—水】
    CodeForces691C 【模拟】
    Codeforces698B【并查集+拆环】
    CodeForces717C 【数学】
    Codeforces710C【数学】
    HDU5904【瞎搞】
  • 原文地址:https://www.cnblogs.com/Open_Source/p/1904940.html
Copyright © 2020-2023  润新知