/*
扑克牌的顺子:
从扑克牌中随机抽出5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,
Q为12,K为13,而大小王可以看成任意数字。
分析:
如何确定5个数字是连续的?
难道用累加判断
过程:
1把数组排序,2统计0的个数,3统计数组中相邻元素之间的空缺总数
如果空缺总数<=0的个数,那么是连续的
注意:如果数组中非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 把数组排序,2统计0的个数,3统计数组中相邻元素之间的空缺总数
如果空缺总数<=0的个数,那么是连续的
注意:如果数组中非0数字重复出现,那么不可能是对子
if(pArr[j] == pArr[j+1] )
{
return false;//出现非0重复元素,直接不可能
}
*/
#include <stdio.h>
#include <algorithm>
using namespace std;
const int MAXSIZE = 15;
bool isContinuous(int* pArr,int n)
{
sort(pArr,pArr+n);
int iCnt_0 = 0;
int i = 0;
while(!pArr[i])//从非零元素起,判断两个相邻元素之间的空缺数
{
iCnt_0++;
i++;
}
int iCnt_blank = 0;//记录总空缺数
for(int j = i ; j < n - 1 ;j++)
{
if(pArr[j] == pArr[j+1] )
{
return false;//出现非0重复元素,直接不可能
}
else
{
iCnt_blank += pArr[j+1] - pArr[j] - 1;
}
}
if(iCnt_blank <= iCnt_0)
{
return true;
}
else
{
return false;
}
}
void process()
{
int n;
while(EOF != scanf("%d",&n))
{
if(!n)
{
break;
}
int iArr[MAXSIZE];
for(int i = 0 ; i < n ; i++)//输入n个数
{
scanf("%d",&iArr[i]);
}
if(isContinuous(iArr,n))
{
printf("So Lucky!\n");
}
else
{
printf("Oh My God!\n");
}
}
}
int main(int argc,char* argv[])
{
process();
getchar();
return 0;
}