贪心算法—Problem C
题意
田忌赛马的故事要求用贪心算法求出田忌能获得最多钱数。
解题思路
输入田忌和国王的马后,把它们的速度升序排列,然后开始比较。首先,比较田忌的快马和国王的快马,如果田忌的快马快于国王的快马,则计数器累加,下标减少;反之,如果慢于国王的快马,则用田忌的最慢马和国王的最快马比(不用比肯定输)计数器减少,对应的下标分别增加和减少。还有一种相等的情况,碰到这种情况,转向比较田忌的慢马和齐王的慢马,若田忌的慢马快于齐王最慢马,计数器累加,下标增加;反之,计数器减少,下标做相应变化。最后把计数器的数据乘200输出钱数。
感想
看似简单的题意,在第一次设计算法时,明明所给的测试数据无误,但还是WA,找了半天也找不到bug,只好重新设计算法。
AC代码
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int tian[1001], king[1001];
int n;
while (cin>> n&&n!=0)
{
int i;
int count=0;
memset(tian,0, sizeof(tian));
memset(king,0, sizeof(king));
for(i = 0; i < n; i++)
{
cin>> tian[i];
}
for(i = 0; i < n; i++)
{
cin>> king[i];
}
sort(&tian[0],&tian[n]);
sort(&king[0],&king[n]);
int minT=0;
int minK=0;
int maxT=n-1;
int maxK=n-1;
for(i=0;i<n;i++)
{
if(tian[maxT]>king[maxK])
{
count++;
maxT--;
maxK--;
}
else if(tian[maxT]<king[maxK])
{
count--;
minT++;
maxK--;
}
else
{
if(tian[minT]>king[minK])
{
count++;
minT++;
minK++;
}
else
{
if(tian[minT]<king[maxK])
{
count--;
minT++;
maxK--;
}
}
}
}
cout<<count*200<<endl;
}
}