贪心的思想:尽量的从最大值找起。然后在剩余之中,再从最大值找起。
一,题意:
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,输出。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int m , n , Case = ;
int a[];
while(cin>>m>>n,m||n){
Case++;
for(int i = ; i < n ; i++){
cin>>a[i];
}
sort(a,a+n); //从小到大排序
int win = , lose = ;
int max = n*m ; //存储牌中最大的牌
for(int i = n - ; win+lose != n ; i-- ){ //win+lose==n 表示手上的牌已经出完
if(max==a[i]){
win++; //牌中最大的牌==手上最大的牌时,必赢一次
max--; //赢了,牌中最大的牌值只要减一即可
}
else{ //否则,必输一次。
lose++; //记录输的次数
max-=; //输了,牌中最大的牌值减二
}
}
cout<<"Case "<<Case<<": "<<win<<endl;
}
return ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。