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