转载请注明出处:http://blog.csdn.net/u010734277
问题概述:假设m个人在玩一个纸牌游戏,其中包括你。在最开始的时候,每个人抽n张牌,每张牌的点数是从1到m*n的不同的整数。在每一轮,每个玩家选择一张牌去跟其他人比较,点数最大的人赢得游戏。n轮结束以后,赢得次数最多的人赢得游戏。
输入输出再次不赘述。
先说下思路。
赢得场数最多为n场(手中拿的牌的数量)
把手里的排跟手里没有的牌从小到大进行比较。比如样例中的1 2 7 9 10 。先将1与3比较,1比三小,然后将2与四比较,2比四小。再将7与5比较,7比5大,那么继续将7与8比较,7比8小;9和10没有比较的,就是剩下两个,那么至少能胜的场数就是2场。所以主要的任务就是知道剩余的张数。
代码:
#include<iostream>
using namespace std;
int main(){
int m,n;
int a[2000];
int b[2000];
int times=1;
while(cin>>m>>n){
if(m==0&&n==0)break;
for(int i=1;i<=n;++i){
cin>>a[i];
}
for(int i=1;i<=n;++i){
for(int t=i+1;t<=n;++t){
if(a[i]>a[t]){
int p=a[i];
a[i]=a[t];
a[t]=p;
}
}
}
int t=1;
int s=2;
for(int i=a[1]+1;i<=m*n;++i){
if(i!=a[s]){
b[t]=i;
++t;
}
if(i==a[s])++s;
}
int x=1;
for(s=1;s<t;){
if(x>n)break;
if(a[x]<b[s]){
x++;s++;
}
else if(a[x]>b[s]){
s++;
}
}
cout<<endl; //删掉
if(n-x+1<0)cout<<"Case "<<times<<": "<<0<<endl;
else cout<<"Case "<<times<<": "<<n-x+1<<endl;
times++;
cout<<endl; //删掉
}
return 0;
}
注意输出中不能有这两个空行,这就是我原来一直presentation error的原因……