九度oj 题目1355:扑克牌顺子
- 题目描述:
-
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。
现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。
- 输入:
-
输入有多组数据。
每组数据包含两行,第一行输入一个正数n(0<=n<=14),表示从扑克牌中抽出的扑克牌数。接下来的一行输入n个数,表示从这幅扑克牌中抽出的牌。如果n=0,则结束输入。
- 输出:
-
对应每组数据,如果抽出的牌是顺子,则输出“So Lucky!”。否则,输出“Oh My God!”。
- 样例输入:
-
5 3 5 1 0 4 5 3 5 4 7 6 5 3 5 7 4 8 0
- 样例输出:
-
So Lucky! So Lucky! Oh My God!
1 #include <cstdio> 2 #include <algorithm> 3 4 int num[16]; 5 int cmp(const void *a, const void *b) { 6 int at = *(int *)a; 7 int bt = *(int *)b; 8 return at - bt; 9 } 10 int main(int argc, char const *argv[]) 11 { 12 int n, k; 13 while(scanf("%d",&n) != EOF && n != 0) { 14 int wcnt = 0; 15 int j = 0; 16 for(int i = 0; i < n; i++) { 17 int tmp; 18 scanf("%d",&tmp); 19 if(tmp != 0) { 20 num[j++] = tmp; 21 } 22 else { 23 wcnt++; 24 } 25 } 26 int m = n - wcnt; 27 if(m == 0) { 28 puts("So Lucky!"); 29 continue; 30 } 31 qsort(num, m,sizeof(int), cmp); 32 bool isOk = true; 33 int need = 0; 34 for(int i = 1; i < m; i++) { 35 if(num[i] == num[i-1]) { 36 isOk = false; 37 break; 38 } 39 need = need + num[i] - num[i-1] - 1; 40 41 } 42 if(need > wcnt) { 43 isOk = false; 44 } 45 if(isOk) { 46 puts("So Lucky!"); 47 } 48 else { 49 puts("Oh My God!"); 50 } 51 } 52 return 0; 53 }