贪心的思想:尽量的从最大值找起。然后在剩余之中,再从最大值找起。
一,题意:
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 }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-14 14:30:37