hdoj1052

Tian Ji -- The Horse Racing

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

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

3.二者的马势均力敌

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|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 @   open source  阅读(436)  评论(0编辑  收藏  举报
编辑推荐:
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
阅读排行:
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!
点击右上角即可分享
微信分享提示