注解
1、贪心。一共M个人,除了自己,可以把另外M-1个人当做1个人,对结论没有影响。
2、要找的是自己最少能赢多少场,也就是最多会输多少场。当自己手中最小的牌比剩下的人手中最小的牌还要小的时候,肯定会输。
3、对自己和其余的人的牌用Hash的方法存储。然后依次遍历剩余人手中的最小的牌,当自己手中有比这张牌还小的牌的时候,此轮必输。求出了必输的轮数,那么最少会获胜的次数就是N减去必输的轮数。
代码
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int n, m;
cin>>n>>m;
int cas = 1;
while(n || m){
int my[n*m+1];
int other[n*m+1];
memset(my, 0, sizeof(my));
memset(other, 0, sizeof(other));
for(int i=0; i<m; i++){
int pos;
cin>>pos;
my[pos] = 1;
}
for(int i=0; i<n*m+1; i++){
other[i] = 1^my[i];
}
int lose = 0;
for(int i=0; i<n*m+1; i++){
if(other[i]){
for(int j=0; j<i; j++){
if(my[j]){
lose++;
my[j] = 0;
break;
}
}
}
}
cout<<"Case "<<cas++<<": "<<m-lose<<endl;
cin>>n>>m;
}
return 0;
}