田忌赛马
题目:
在故事中的田忌赛马,让人都懂。
国王: 一等马,二等马, 三等马。
田忌: 一等马,二等马, 三等马。
同等级的马,是国王赢。不一样等级的马,就是看谁的等级高。
比赛的过程的就是如下:
国王 一等马 pk 田忌 三等马。
国王 二等马 pk 田忌 一等马。
国王 三等马 pk 田忌 二等马。
现在要给你一些马,让你和国王的马,相比较。
输入:
一个n,表示多少各自匹马!之后第二行就是田忌的马的战斗值,第三行就是国王马的战斗值。
输出:
田忌赢国王的次数和输的次数之和。
解题思路:
(1)故事里面比赛的马,明显国王的马比田忌的马好。
(2)比赛拒绝平局,要把每一匹的马的作用发挥到最好,最值。
(3)比赛时,马比不过就取与国王的最好的马去比赛,从而去抵消掉过往最好的马。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int a[1000];
int n;
int b[1000];
int i,s,j,e,sum;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for( i=0;i<n;i++)
scanf("%d",&a[i]);
for( i=0;i<n;i++)
scanf("%d",&b[i]);
sort(a,a+n);
sort(b,b+n);
i=s=0; //后面开始。
j=e=n-1; //前面开始
sum=0;
while(i<=j)
{
if(a[i]>b[s]) //田忌最差的比国王最差的好,就赚了一场胜利。
{
sum++;
s++;
i++;
}
else
if(a[i]<b[s]) //田忌最差的比国王的最差的还差,就用最差的换掉国王最好的。
{
sum--;
e--;
i++;
}
else
{
if(a[j]>b[e])
{
sum++;
e--;
j--;
}
else
{
if(a[i]<b[e]) //用天田忌最差的去抵消国王的最好的
{
sum--;
e--;
i++;
}
}
}
}
printf("%d\n",sum);
}
return 0;
}