這題是在TOJ上看見的,想了半天才明白,呵呵。
田忌賽馬:
每組數據代表馬奔跑的速度,第一行是馬的數量,第二行是田忌的馬的速度,第二行是齊威王的馬的速度。
思想是這樣的,先把各組馬的速度從大到小排序,然后用田忌的馬順序與齊威王的馬比較
if(田忌的馬快)
比較下一對馬;
else if(田忌的馬慢)
用田忌最慢的馬和齊威王的這匹馬賽
else
{
從未進行比賽的速度小的馬開始從后往前比
if(田忌的馬快)
繼續往前比
else
用這匹馬和剛才跑平的齊威王的馬比
//總之原則就是如果這匹馬不能贏,就讓他和比他快很多的馬比,這樣保持速度較快的馬
}
代碼:
田忌賽馬:
每組數據代表馬奔跑的速度,第一行是馬的數量,第二行是田忌的馬的速度,第二行是齊威王的馬的速度。
思想是這樣的,先把各組馬的速度從大到小排序,然后用田忌的馬順序與齊威王的馬比較
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; }

