【剑指offer+扑克牌顺子+数学建模+模拟】

来源:互联网 发布:淘宝图片的尺寸是多少 编辑:程序博客网 时间:2024/05/22 00:24

【题目链接】:http://ac.jobdu.com/problem.php?pid=1355

【题目描述】:

题目1355:扑克牌顺子

时间限制:2 秒

内存限制:32 兆

特殊判题:

提交:1806

解决:530

题目描述:

LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\ 王可以看成任何数字,并且A看作1,J11,Q12,K13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作24),“So Lucky!”LL决定去买体育彩票啦。

现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0

输入:

输入有多组数据。

每组数据包含两行,第一行输入一个正数n(0<=n<=14),表示从扑克牌中抽出的扑克牌数。接下来的一行输入n个数,表示从这幅扑克牌中抽出的牌。如果n=0,则结束输入。

输出:

对应每组数据,如果抽出的牌是顺子,则输出“So Lucky!”。否则,输出“Oh My God!”

样例输入:
53 5 1 0 453 5 4 7 653 5 7 4 80
样例输出:
So Lucky!So Lucky!Oh My God!

【思路】:

把扑克牌的背景抽象成计算机语言,即把五张牌看成由5个数字组成的数组。大小王看做事特殊的数字,不妨把它们定义为0,这样就能和其他牌区分开来。



【代码】:

/***********************剑指offer 扑克牌顺序【模拟】Author:herongweiTime:2017/5/12 19:00language: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 5bool 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;}



0 0