田忌赛马,经典的贪心,不过很难想到呀,每次都用最快跟最快的,最慢的跟最慢的进行比较、判断
1)若田最快的比王最快的慢,则用最慢的跟王最快的比,输掉一局;反之,则赢了当然是最划算的选择了
2)若田最慢的比王最慢的还慢,则用最慢的跟王最快的比,输掉一局;反之,同上。
这俩步是贪心所在;
还有就是注意想等到情况……
看代码吧
#include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(int*)a-*(int*)b; } int main() { int s[1001],t[1001],n; while(scanf("%d",&n)==1&n!=0) { for(int i=0;i<n;i++) scanf("%d",&s[i]); for(int i=0;i<n;i++) scanf("%d",&t[i]); qsort(s,n,sizeof(s[0]),cmp);//排序,速度慢的在前面 qsort(t,n,sizeof(t[0]),cmp); int s1=0,s2=0,e1=n-1,e2=n-1; int sum1=0,sum2=0; while(s1<=e1&&s2<=e2) { if(s[s1]>t[s2])//最慢的马进行比较, { sum1++;s1++;s2++; } else if(s[s1]<t[s2])//若最慢的比王的还慢,则用来跟王的最快比 { sum2++;s1++;e2--; } else { if(s[e1]>t[e2])//最快的马进行比较 { sum1++;e1--;e2--; } else if(s[e1]<t[e2])//若最快的比王的最快的还慢,则用最慢的更王的最快的比 { sum2++;s1++;e2--; } else { if(s[s1]==t[e2])//剩下的马均相等的情况 break; else { sum2++;s1++;e2--; } } } } printf("%d\n",(sum1-sum2)*200); } return 0; }