本题故事是由田忌赛马引起的,但是什么田忌赛马的我是不管咯啊。废话不多说,先把题目大概意思讲一下:路人甲和路人乙各有n匹马,现在给出了这些马的速度,如何匹配这些马儿使得路人甲获得最大利益?(ps:赢一场得200积分,输一场减去200积分,平局不增不减)。
分析:这题目是我在题目分类中看到的一道贪心题。我们可以把它做如下分类;
1、路人甲的最快马速度 > 路人乙的最快马速度, 则该两匹马匹配;
2、路人甲的最快马速度 < 路人乙的最快马速度,则用路人甲的最慢马与路人乙的最快马匹配;
3、路人甲的最快马速度 = 路人乙的最快马速度:(a)路人甲的最慢马速度 > 路人乙最慢马速度,该两匹最慢马匹配;
(b)路人甲的最慢马速度 <= 路人乙的最慢马速度,路人甲的最慢马与路人乙的最快马匹配。
这是解决该题目的分类情况。详细分析请参考:http://blog.csdn.net/qzh3578/article/details/12707889
#include<stdio.h> #include<algorithm> using namespace std; bool cmp(int x,int y) { return x>y; } int main() { int n; while(scanf("%d",&n)!=EOF&&n!=0) { int a[1005],b[1005]; 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); int head1=0,tail1=n-1; int head2=0,tail2=n-1; int sum=0; while(head1<=tail1) { if(a[head1]>b[head2]) { sum+=200; head1++; head2++; } else if(a[head1]<b[head2]) { sum-=200; tail1--; head2++; } else { if(a[tail1]>b[tail2]) { sum+=200; tail1--; tail2--; } else { if(a[tail1]<b[head2]) sum-=200; tail1--; head2++; } } }printf("%d\n",sum); }return 0; }