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的解题报告。 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一次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种常用方案!