您的位置:首页 > 其它

杭电 ACM Step(3)

2018-04-01 10:10 615 查看

Tian Ji – The Horse Racing







题目求解

让田忌最慢的马和齐王最慢的马相比,如果田忌最慢的马比齐王最慢的马快,先让田忌赢一场。因为在这种情况下,田忌所有的马都比齐王最慢的马快,所以用一个最慢的马和齐王最慢的马比,减少田忌的损耗。

如果田忌最慢的马比齐王最慢的马慢,则用田忌最慢的马和齐王最快的马相比,让田忌输一场。在这种情况下,田忌用最慢的马拼掉齐王最快的马。

当田忌最慢的马和齐王最慢的马速度一样时

如果田忌最快的马比齐王最快的马快,先让田忌赢一场

田忌最快的马比齐王最快的马慢,用田忌最慢的马与齐王最快的马比,田忌输一场。

田忌和齐王最快的马一样快时

田忌最慢的马比齐王最快的马慢,则先让田忌输一场

其余情况则说明田忌和齐王还未安排比赛的所有的马的速度都一样。所以田忌不输不赢。

总体思想

贪心算法:局部最优,你的每一步都是最优的,不需要遍历全部找最优。

实现代码

#include <stdio.h>
void SelectSort(int s[],int N)
{
int flag;
int t;
for(int i=0;i<N;i++)
{
flag=i;
for(int j=i+1;j<N;j++)
{
if(s[j]<s[flag])
flag=j;
}
t=s[i];
s[i]=s[flag];
s[flag]=t;
}
}
int main()
{
int T;
int A[1000];
int B[1000];
while(scanf("%d",&T),T)
{
for(int i=0;i<T;i++) scanf("%d",&A[i]);
for(int i=0;i<T;i++) scanf("%d",&B[i]);
SelectSort(A,T);
SelectSort(B,T);
int win=0;
int k=T-1;
int j=0;
for(int i=0;i<T;)
{
if(A[i]>B[j]) //如果A最慢的马比B最慢的马快,先让A赢一局
{
i++;//A和B最慢的马都提高一个档次
j++;
win++;
}
else if(A[i]<B[j])//如果A最慢的马比B最慢的马慢,和B最快的马比,A输一场
{
k--;//B最快的马降低一个档次
i++;//A最慢的马提高一个档次
win--;
}
else //A和B最慢的马一样慢
{
if(A[T-1]>B[k])//A最快的马比B最快的马快时,A赢一场
{
win++;
T--;//A最快的马变为次一档
k--;//B最快的马变为次一档
}
else if(A[T-1]<B[k]) //A最快的马比B最快的马慢时,A用最慢的马和B最快的马比,输一场
{
win--;
k--;//B最快的马降低一个档次
i++;//A最慢的马提高一个档次
}
else//A和B最快的马一样快,A最慢的马和B最快的马比,输一场
{
if(A[i]<B[k]) win--;
i++;//其余情况则表明A所有的马都一样快了
//则A最慢的马和B最快的马速度一样,不输不赢
k--;
}
}
}
printf("%d\n",win*200);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: