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

【题目链接】: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!”

样例输入:
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!

【思路】:

把扑克牌的背景抽象成计算机语言,即把五张牌看成由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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值