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