耳熟能详的故事,田忌赛马,第一行给出田忌的马的速度,第二行是齐王的马的速度,田忌赢一场得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\n",ans); 55 } 56 return 0; 57 }