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 }

 


posted @ 2012-02-02 16:18  笑巧  阅读(504)  评论(0编辑  收藏  举报