Poj 2287 田忌賽馬解題詳解(貪心思想)
阿新 • • 發佈:2019-02-17
題意是:田忌賽馬的故事,兩個人賽馬,第一行輸入的數是兩個人馬的匹數,都是相同的,第二行輸入的是田忌的馬的強弱值,第三行輸入的是國王馬的強弱值,然後如果n==0則程式結束。
解題思路:貪心思想
如果田忌的最強馬大於國王的最強馬直接比
如果田忌的最強馬小如國王的最強馬拿最弱的那匹馬跟國王的最強馬比
如果田忌的最強馬等於國王的最強馬拿最弱的那匹馬國王比較
如果·最弱的馬跟最弱的馬相等直接比較
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n;
const int maxn = 100000;
int a[maxn];//田忌的馬
int b[maxn];//齊王的馬
int cmp(int x1,int x2)
{
return x1>x2;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n == 0)
{
return 0;
}
for(int i = 0; i < n; i++)//輸入田忌的馬
{
scanf ("%d",&a[i]);
}
for(int i = 0; i < n; i++)//輸入國王的馬
{
scanf("%d",&b[i]);
}
sort(a,a+n,cmp);//進行從高到底的一次排序
sort(b,b+n,cmp);
long long sum =0;
int j = 0;
int i = 0;
int ti = n-1;//最弱的馬的位置
int tj = n-1;//國王最弱馬的位置
int flag = 0;//比的次數
while(flag!=n)
{
flag++;
if(a[i] > b[j])//如果田忌的最強馬的力量大於國王最強馬的力量就比
{
i++;
j++;
sum++;
}
else if(a[i] < b[j])//如果田忌的最強馬小如國王的最強馬的力量就用田忌最弱的馬跟國王比輸一場
{
ti--;
j++;
sum--;
}
else if(a[i] == b[j])//如果田忌的最強馬跟國王最強馬相等,
{
if(a[ti] == b[tj])//田忌的最弱馬跟國王最弱馬相等還是用田忌的最弱馬跟國王的最強馬相比較
{
if(a[ti] == b[j])
{
ti--;
j++;
}
else if(a[ti] < b[j])//如果田忌的最弱馬小如國王的最弱馬
{
ti--;
j++;
sum--;
}
}
else if(a[ti] < b[tj])//田忌的最弱馬小如國王的最弱馬還是拿田忌的最弱馬跟國王最強馬拿來比較
{
ti--;
j++;
sum--;
}
else if(a[ti] > b[tj])//如果田忌的最弱馬大於國王的最弱馬直接最弱馬最弱馬相比
{
ti--;
tj--;
sum++;
}
}
}
sum = sum*200;
printf("%lld\n",sum);
}
return 0;
}
/*
幾組好的測試資料
8
11 9 8 8 8 4 3 2
11 8 8 8 8 4 3 2
答案:800
3
89 85 81
90 85 81
答案:200
3
2 3 5
3 4 4
答案:0
*/