jhljx跑跑跑(找规律)
题目来源:https://biancheng.love/contest/41/problem/D/index
jhljx跑跑跑
题目描述
数学不好的jhljx又在和别人打牌,他们一共m人每人n张牌,牌只有点数没有花色,从1点到k点一共n*m张。每轮每个人出一张牌,只要jhljx出的牌比其余m-1个人都大,jhljx这轮就能跑掉。现在jhljx手里的牌是什么全都可以告诉你,那么他至少能跑掉几次呢?
没时间解释了,jhljx快跑了,现在很急很关键!
输入
多组测试数据,每组测试数据两行。
第一行为m,n两个整数,第二行为n个整数,表示jhljx手牌点数。
n*m<=10000
输出
对于每组测试数据输出一行为jhljx能赢的次数。
输入样例
2 3
1 3 6
输出样例
1
解题思路:其实就是一共有m个人每个人手里拿着n张牌。(牌的大小从1到n*m即total),题目要求找到获胜的最少次数,也就是至少获胜多少次。现在分析怎样才能达到至少的获胜次数。
分析:
1、已经知道自己拿了什么牌,因为牌是已知的,所以也知道剩下的牌是什么了;
2、将自己手中的牌进行排序,整理出合适的牌面;
3、其他人作弊把手里的牌都合在一起了,所以一共两个人打牌,(其实是一个人在打牌),这样的话我每次都出自己手里最大的牌,对面的人只要能大得过就输掉,直到手里的牌出完。
4、在这里需要说明一下,其他人的牌合在一起只是为了方便理解,但是在具体实现中还是要注意自己的牌是n个
给出代码:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 int a[10010]; 5 int b[10010]; 6 int m,n,total,tn,i,j,num,counter; 7 int main() 8 { 9 while(~scanf("%d%d",&m,&n)) 10 { 11 total=n*m; 12 tn=n; 13 counter=num=0; 14 for(i=1;i<=n;i++) 15 scanf("%d",&a[i]); 16 for(i=1;i<=total;i++) 17 b[i]=i; 18 sort(a+1,a+n+1); 19 // for(i=1;i<=n;i++) 20 // printf("%d ",a[i]); 21 // printf("\n"); 22 for(i=total;i>=1&&tn>0;i--) 23 { 24 if(a[tn]!=b[i]) 25 counter++; 26 else 27 { 28 if(0==counter) 29 num++; 30 else 31 counter--; 32 tn--; 33 } 34 } 35 printf("%d\n",num); 36 } 37 return 0; 38 }
作者: 伊甸一点
出处: http://www.cnblogs.com/zpfbuaa/
本文版权归作者伊甸一点所有,欢迎转载和商用(须保留此段声明),且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文链接 如有问题, 可邮件(zpflyfe@163.com)咨询.