這題是在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;
        }