HDU1052 (贪心)

田忌赛马,经典的贪心,每次都用最快跟最快的,最慢的跟最慢的进行比较、判断

1)若田最快的比王最快的慢,则用最慢的跟王最快的比,输掉一局;反之,则赢了当然是最划算的选择了

2)若田最慢的比王最慢的还慢,则用最慢的跟王最快的比,输掉一局;反之,同上。

具体解题思路如下:

1.当田忌最慢的马比齐王最慢的马快,赢一场先。因为始终要赢齐王最慢的马,不如用最没用的马来赢它。
2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场。因为田忌最慢的马始终要输的,不如用它来消耗齐王最有用的马。
3.当田忌最慢的和齐王最慢的马慢相等时,分4和5讨论。
4.当田忌最快的马比齐王最快的马快时,赢一场先。因为最快的马的用途就是来赢别人快的马,别人慢的马什么马都能赢。
5.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场,因为反正要输一场,不如拿最没用的马输。
6.当田忌最快的马和齐王最快的马相等时,这就要展开讨论了,贪心方法是,拿最慢的马来和齐王最快的马比。

代码如下:

View Code
 1 #include<iostream>
 2 #include<algorithm>
 3  using  namespace std;
 4 
 5  #define Max 1005
 6  int t[Max],k[Max];
 7 
 8  bool cmp ( int x, int y)
 9 {
10      return x<y;
11 }
12 
13  int main()
14 {
15      int n,i,j;
16      while(cin>>n)
17     {
18          if(n== 0break;
19          for(i= 0;i<n;i++)
20             cin>>t[i];
21          for(j= 0;j<n;j++)
22             cin>>k[j];
23         sort(t,t+n,cmp); // 排序,速度慢的在前面
24          sort(k,k+n,cmp);
25          int sum= 0,end1=n- 1,end2=n- 1;
26         i= 0; j= 0;
27          while(i<=end1&&j<=end2)
28         {
29              if(t[i]>k[j]) // 最慢的马进行比较
30              { i++; j++; sum++; }
31              else  if(t[i]<k[j]) // 若最慢的比王的还慢,则用来跟王的最快比
32              { i++;  end2--; sum--;}
33              else { 
34                  if(t[end1]>k[end2])  // 最快的马进行比较
35                  { end1--; end2--; sum++; }
36                  else  if(t[end1]<k[end2]) // 若最快的比王的最快的还慢,则用最慢的跟王的最快的比
37                  { i++; end2--; sum--;}
38                  else{
39                      if(t[i]==k[end2])  // 剩下的马均相等的情况
40                           break;
41                      else 
42                     { i++; end2--; sum--; }
43                 }
44             }
45         }
46         cout<<sum* 200<<endl;
47     }
48      return  0;
49 }

 


你可能感兴趣的:(HDU)