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 }
版权声明:本文为博主原创文章,未经博主允许不得转载。