这题是在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;
}