田忌赛马,经典的贪心,每次都用最快跟最快的,最慢的跟最慢的进行比较、判断
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== 0) break;
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 }
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== 0) break;
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 }