poj1323-Game Prediction(贪心思想)

贪心的思想:尽量的从最大值找起。然后在剩余之中,再从最大值找起。
一,题意:
  M个人,每人N张牌,每轮比较谁出的牌大,最大者为胜。现在给定M和N,以及你的牌,要求输出你至少能确保获得几轮的胜利
  从"至少能赢几轮"可以看出:每个人必定都从最大的牌开始出。(只判定输赢两种情况即可)
二,思路:
  1,输入并从小到大排序;
  2,循环并记录赢的次数;
  3,输出;
三,步骤:
  1,sort函数排序
  2,先最大的牌比较,再从剩余的牌中,找最大的牌比较,依次循环下去,直到手中牌出完。
    循环开始:i = n-1(手中最大的牌)循环条件win+lose != n(牌未出完)循环处理 i--(每次循环完手中的牌跳到前一张);
    if 手中最大的牌值等于牌中最大的牌值时,必赢win++ ; max--;
    else 必输lose++ ; max -= 2;
   注意:赢了,牌中最大牌值减一,输了减二。
  3,输出。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main(){
 5     int m , n , Case = 0 ;
 6     int a[1005];
 7     while(cin>>m>>n,m||n){
 8         Case++;
 9         for(int i = 0 ; i < n ; i++){
10             cin>>a[i];
11         }
12         sort(a,a+n);      //从小到大排序 
13         int win = 0 , lose = 0 ;
14         int max = n*m ;   //存储牌中最大的牌 
15         for(int i = n - 1 ; win+lose != n ; i-- ){ //win+lose==n 表示手上的牌已经出完 
16             if(max==a[i]){
17                 win++;    //牌中最大的牌==手上最大的牌时,必赢一次 
18                 max--;       //赢了,牌中最大的牌值只要减一即可 
19             } 
20             else{         //否则,必输一次。 
21                 lose++;   //记录输的次数 
22                 max-=2;   //输了,牌中最大的牌值减二
23             } 
24         }
25         cout<<"Case "<<Case<<": "<<win<<endl;
26     }
27     return 0;
28 }
View Code

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-10-18 09:06  My_Sunshine  阅读(822)  评论(0编辑  收藏  举报