这题是在TOJ上看见的,想了半天才明白,呵呵。
田忌赛马:
每组数据代表马奔跑的速度,第一行是马的数量,第二行是田忌的马的速度,第二行是齐威王的马的速度。
思想是这样的,先把各组马的速度从大到小排序,然后用田忌的马顺序与齐威王的马比较
if(田忌的马快)
      比较下一对马;
else  if(田忌的马慢)
      用田忌最慢的马和齐威王的这匹马赛
else
{
      从未进行比赛的速度小的马开始从后往前比
      if(田忌的马快)
              继续往前比
      else
            用这匹马和刚才跑平的齐威王的马比   
//总之原则就是如果这匹马不能赢,就让他和比他快很多的马比,这样保持速度较快的马
}

代码:

Source Code

Problem: 2287 User: wic
Memory: 272K Time: 141MS
Language: C++ Result: Accepted
  • Source Code
    #include<iostream>
        #include<algorithm>
        using namespace std;
        int t[1002],k[1002];
        bool comp(int a, int b)
        {
        return a>b;
        }
        int main()
        {
        int n,i,j,m;
        int head,tailt,tailk;
        while(cin>>n && n){
        memset(t,0,sizeof(t));
        memset(k,0,sizeof(k));
        for(i=0; i<n; i++)
        cin>>t[i];
        for(i=0; i<n; i++)
        cin>>k[i];
        sort(t,t+n,comp);
        sort(k,k+n,comp);
        head=0;
        tailt=n-1;
        tailk=n-1;
        int ans=0;
        for(i=0; i<n; i++){
        if(t[head]>k[i])
        head++,ans+=200;
        else if(t[head]<k[i])
        tailt--,ans-=200;//既然已经输了,就用最慢的马和齐威王的马比
        else{//如果平了,从后往前看
        for(j=tailt,m=tailk; j>=head; j--,m--){
        if(t[j]>k[m])
        ans+=200,tailt--,tailk--;
        else{//如果赢不了就让他输的更彻底
        if(t[j]<k[i])
        ans-=200;
        tailt=--j;
        tailk=m;
        break;
        }
        }
        }
        if(head>tailt)break;
        }
        cout<<ans<<endl;
        }
        return 0;
        }