P2649 游戏预言
题目描述
John和朋友们在玩纸牌游戏,他们一共有m个人(包括John)。他们的纸牌比较特殊,一共有n*m张牌,牌号分别为1,2,…,n*m,没有牌号相同的牌。每个人先拿到n张牌,然后,每一轮,每个人出一张牌,谁最大则谁赢得这一轮。现在已知John手中的n张牌,计算他最少能赢得多少轮。
输入输出格式
输入格式:
第一行为两个整数m和n,2≤m≤20,1≤n≤50;第二行有n个正整数,表示John手中的n张牌的数值。
输出格式:
仅一个整数,表示John最少能赢的次数。
输入输出样例
输入样例#2: 复制
6 11
62 63 54 66 65 61 57 56 50 53 48
输出样例#2: 复制
4
绿色系列五:
又是一道思路好题。
john赢得最少的数量就是他的牌没人比他大的情况;
因为其他人如果要尽量减少john的赢的数量,那他一定要能压john就尽量压。
快排john的牌,然后从大到小出牌。
从m*n 开始从大到小枚举;
如果john的牌与枚举数相等,他就赢了,赢的数量+1;
反之 因为这张牌不在他手上,所以这张牌会用来压他的牌,
因为求的是赢的最少局数,所以赢的数量-1(好好理解);
然后可以调试一下看看第一个样例的代码实现过程就应该可以理解数量为什么要减一。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 int n,m; 9 int a[52],sum,ans; 10 11 int main() 12 { 13 scanf("%d%d",&m,&n); 14 for(int i=1;i<=n;++i) 15 scanf("%d",&a[i]); 16 sort(a+1,a+n+1); 17 for(int i=n,j=n*m;i>0;--i,--j) 18 { 19 if(a[i]==j) 20 sum++; 21 else 22 { 23 sum--; 24 i++; 25 } 26 ans=max(ans,sum); 27 } 28 printf("%d",ans); 29 return 0; 30 }