【题目链接】:http://ac.jobdu.com/problem.php?pid=1355
【题目描述】:
题目1355:扑克牌顺子
【思路】:
把扑克牌的背景抽象成计算机语言,即把五张牌看成由5个数字组成的数组。大小王看做事特殊的数字,不妨把它们定义为0,这样就能和其他牌区分开来。
【代码】:
/***********************
剑指offer 扑克牌顺序【模拟】
Author:herongwei
Time:2017/5/12 19:00
language:C++
http://blog.csdn.net/u013050857
***********************/
#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#define rep(i,k,n) for(int i=k;i<=n;++i)
#define rep2(i,k,n) for(int i=k;i>=n;--i)
using namespace std;
const int maxn= 1e2+233;
const int N= 1e6;
const int MOD = 1e9+7;
typedef long long LL;
int t,n,m,k,ret,ans,tot=0;
int arr[15];
inline int read(){
int c=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
return c*f;
}
void quick_sort(int* arr, int l, int r){
if(l<r){
///Swap(s[l], s[(l + r) / 2]); 将中间的这个数和第一个数交换 参见注1
int i=l, j=r, tp=arr[l];
while(i<j)
{
while(i<j&&arr[j]>=tp)j--; /// 从右向左找第一个小于tp的数 j--;
if(i<j)arr[i++]=arr[j];
while(i<j&&arr[i]<=tp)i++; /// 从左向右找第一个大于等于tp的数 i++;
if(i<j)arr[j--]=arr[i];
}
arr[i] = tp;
quick_sort(arr,l,i-1); /// 递归调用
quick_sort(arr,i+1,r);
}
}
/// 0 1 3 4 5
bool is_continuous(int* arr,int n){
if(arr==NULL || n<1) return false;
quick_sort(arr,1,n);///先排序使得序列有序
/// rep(i,1,n) cout<<arr[i]<<" ";;
int num_zero = 0; ///统计0的个数
int num_gap = 0; ///统计缺位的个数
for(int i=1; i<=n && arr[i]==0;++i) ++num_zero;
int small=num_zero+1;
int big = small+1;
while(big<n){ /// 循环o(n)查找缺位个数
if(arr[big]==arr[small]) return false;
num_gap += arr[big]-arr[small]-1;
small=big;
++big;
}
// cout<<num_gap<<" "<<num_zero<<endl;
return num_gap<=num_zero?true:false;
}
int main(){
// freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d",&n)&&n){
memset(arr,0,sizeof(arr));
rep(i,1,n) arr[i]=read();
if(is_continuous(arr,n))puts("So Lucky!");
else puts("Oh My God!");
}
return 0;
}