UVALive

耳熟能详的故事,田忌赛马,第一行给出田忌的马的速度,第二行是齐王的马的速度,田忌赢一场得200,输一场失去200,平局不得也不失,问最后田忌最多能得多少钱?

都知道在故事里,田忌用下等马对上等马,中等马对下等马,上等马对中等马,一负两胜,这就是贪心的策略。在这题中,先将速度排序,首先用田忌速度最快的马去匹配,如果大于齐王速度最快的马,就刚它,如果小于它,那么就说明这一场肯定是要输了,既然是要输,那么用速度最慢的马去输,这样可以将速度最快的马保留下来,如果和齐王的速度最快的马速度相同,那么暂时放在这里,去比较速度最慢的田忌和齐王的马,如果最慢的马田忌的快那么就赢了这一局,如果小于或等于,说明赢不了,那么用这匹慢马去和之前速度最快的比,这样还是将速度最快的马保留下来。

反正就是如果赢不了的比赛,我就用最慢的马去消耗你最快的马!

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int M = 1e3 + 10;
 8 int a[M],b[M];
 9 bool cmp(int x,int y) {return x>y;}
10 
11 int main()
12 {
13     int n;
14     while (~scanf("%d",&n)&&n)
15     {
16         for (int i=1 ; i<=n ; i++) scanf("%d",a+i);
17         for (int i=1 ; i<=n ; i++) scanf("%d",b+i);
18         sort(a+1,a+n+1,cmp);
19         sort(b+1,b+n+1,cmp);
20         int sa=1,sb=1,ea=n,eb=n,ans=0;
21         a[0]=a[n+1]=b[0]=b[n+1]=0;
22         while (n--)
23         {
24             if (a[sa]>b[sb])
25             {
26                 ans+=200;
27                 sa++;
28                 sb++;
29                 continue;
30             }
31             if (a[sa]==b[sb])
32             {
33                 if (a[ea]>b[eb])
34                 {
35                     ans+=200;
36                     ea--;
37                     eb--;
38                 }
39                 else
40                 {
41                     if (a[ea]<b[sb]) ans-=200;
42                     sb++;
43                     ea--;
44                 }
45                 continue;
46             }
47             if (a[sa]<b[sb])
48             {
49                 ans-=200;
50                 ea--;
51                 sb++;
52             }
53         }
54         printf("%d
",ans);
55     }
56     return 0;
57 }
View Code
原文地址:https://www.cnblogs.com/JJCHEHEDA/p/5663032.html