题目描述:

如果大家玩过欢乐斗地主这个游戏,就一定知道有一个具有“提示”功能的按钮。如果你不知道你现在手里的牌有没有比上家大的牌,并且你也懒得去一张一张地看你手中的牌。这时候你就可以点“提示”按钮,系统会告诉你是否有这样的牌。

如果你是一个喜欢挑战的人,你就一定会想,能不能写一个程序,让它实现欢乐斗地主中的“提示”按钮的功能。

现在,我们把“提示”按钮所具有的功能简化,它只需要找出在上家出的牌是“三带一对”的情况下你手中的牌是否比上家的牌大。

输入:

每组测试数据可能有多组输入,对于每一组输入,

输入的第一行包括一个整数N(1<=N<=18),代表你手中现在还剩下的扑克牌的张数。

接下来的一行包括N个数字(1-13,分别代表扑克牌中的A-K),给你的这N个数字是无序的。

接下来的一行包括五个数字,前三个数字是相同的,后两个数字是相同的,代表上家出的“三带一对”。

输出:

如果你手中的牌有比上家的“三带一对”大的,输出这样的牌,输出的格式与输入中的第三行相同,即五个数字:前三个是一样的,后两个是一样的,代表你手中的“三带一对”。如果你手中没有比上家的“三带一对”大的牌,请输出“My God”。

样例输入:
8
1 6 4 8 4 7 6 4
3 3 3 9 9
8
1 6 4 8 4 7 6 4
8 8 8 2 2
样例输出:
4 4 4 6 6
My God
提示:

1.“三带一对”:三张同样数字的牌+两张同样数字的牌,此时这五张牌可以同时出。“三带一对”比大小的规则如下——只需要比较三张同样数字的牌的数字的大小,而不需要考虑两张同样数字的牌的数字的大小。比如:“三个5带两个3”,比“三个4带两个8”要大。

2.大家都知道,在扑克牌中A和2要比3-K都要大,请大家在程序中进行处理。

3.如果你手中的牌有多种出法能够比上家的“三带一对”大,你需要选择“三带一对”中三张相同的牌数字较小的那种出法。比如说,如果上家出的牌是3 3 3 4 4,而你现在手中有6 6 6 7 7 7这6张牌,你需要出的牌是6 6 6 7 7,而不是7 7 7 6 6,如果三带最小的有多个,则需要输出一对值最小的那个结果。

4.你可以放心,我们发的牌以及出的牌中不会出现大小王。

一开始的代码是这样

 #include <cstdio>
#include <cstring>
#include <algorithm> int card[];
int base[];
int n;
int num[] = {,,,,,,,,,,,,,};
int card2[];
int card3[]; int cmp(const void *a , const void *b) {
int at = *(int *)a;
int bt = *(int *)b;
return num[at] - num[bt];
}
int main(int argc, char const *argv[])
{
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&card[i]);
}
for(int i = ; i < ; i++) {
scanf("%d",&base[i]);
}
qsort(card, n, sizeof(int), cmp);
int i = ;
int p2 = , p3 = ;
while(i < n) {
int cnt = ;
while(card[i] == card[i-]) {
cnt++;
i++;
}
if(cnt == ) {
card2[p2++] = card[i-];
}
else if(cnt == ) {
card3[p3++] = card[i-];
card2[p2++] = card[i-];
}
i++;
}
int t3 = -;
for(int j = ; j < p3; j++) {
if(num[card3[j]] > num[base[]]) {
t3 = card3[j];
break;
}
}
if(t3 == -) {
puts("My God");
continue;
}
int t2 = -;
for(int j = ; j < p2; j++) {
if(card2[j] != t3) {
t2 = card2[j];
break;
}
}
if(t2 == -) {
puts("My God");
continue;
}
printf("%d %d %d %d %d\n",t3,t3,t3,t2,t2);
}
return ;
}

居然一个例子都没通过。

这段代码的两个问题,38行,cnt==4时没处理

31行,没判断i < n

修改如下

 #include <cstdio>
#include <cstring>
#include <algorithm> int card[];
int base[];
int n;
int num[] = {,,,,,,,,,,,,,};
int card2[];
int card3[]; int cmp(const void *a , const void *b) {
int at = *(int *)a;
int bt = *(int *)b;
return num[at] - num[bt];
}
int main(int argc, char const *argv[])
{
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&card[i]);
}
for(int i = ; i < ; i++) {
scanf("%d",&base[i]);
}
qsort(card, n, sizeof(int), cmp); /*for(int i = 0; i < n; i++) {
printf("%d ",card[i]);
}
puts("");*/
int i = ;
int p2 = , p3 = ;
while(i < n) {
int cnt = ;
while(i < n && card[i] == card[i-]) {
cnt++;
i++;
}
if(cnt >= ) {
card3[p3++] = card[i-];
card2[p2++] = card[i-];
}
else if(cnt >= ) {
card2[p2++] = card[i-];
}
i++;
}
int t3 = -;
for(int j = ; j < p3; j++) {
if(num[card3[j]] > num[base[]]) {
t3 = card3[j];
break;
}
}
if(t3 == -) {
puts("My God");
continue;
}
int t2 = -;
for(int j = ; j < p2; j++) {
if(card2[j] != t3) {
t2 = card2[j];
break;
}
}
if(t2 == -) {
puts("My God");
continue;
}
printf("%d %d %d %d %d\n",t3,t3,t3,t2,t2);
}
return ;
}

当然,也可以换一种思路

 #include <cstdio>
#include <cstring> int card[];
int num[] = {,,,,,,,,,,,,,,,};
int fnum[] = {,,,,,,,,,,,,,};
int n;
int m, p;
int main(int argc, char const *argv[])
{
while(scanf("%d",&n) != EOF) {
memset(card,,sizeof(card));
while(n--) {
int tmp;
scanf("%d",&tmp);
card[tmp]++;
}
scanf("%d %d %d %d %d",&m,&m,&m,&p,&p);
bool isFind = false;
for(int i = fnum[m]+; i <= && !isFind; i++) {
if(card[num[i]] >= ) {
for(int j = ; j <= && !isFind; j++) {
if(card[num[j]] >= && j != i) {
int t1 = num[i], t2 = num[j];
printf("%d %d %d %d %d\n",t1,t1,t1,t2,t2);
isFind = true;
}
}
}
}
if(!isFind) {
puts("My God");
}
}
return ;
}

九度oj 题目1363:欢乐斗地主的更多相关文章

  1. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  2. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. 用GWT开发的HelloGWT程序

    GWT项目可以通过 命令行和Eclipse插件两种方法创建.创建GWT项目的命令是webAppCreator,具体使用方法可以看GWT的开发文档. Eclipse插件安装完成后,Eclipse的工具条 ...

  2. unbuntu&vim&Kali的各种小知识

    1. vmware workstation 15.0.0 2.ubuntu-18.10-desktop  使用网络地址转换 VMware workstation 1.ctrl+alt 返回  unbu ...

  3. HTML5中的SSE(服务器推送技术)

    本文原链接:https://cloud.tencent.com/developer/article/1194063 SSE技术详解:一种全新的HTML5服务器推送事件技术 前言 概述 基本介绍 与We ...

  4. IDE spec for registry settings

    IDE spec for registry settings Advanced customization of Visual Assist is possible with registry set ...

  5. 《队长说得队》【Alpha】Scrum meeting 3

    项目 内容 这个作业属于哪个课程 >>2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 >>实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 ...

  6. javaweb基础(20)_JavaBean总结

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  7. CodePlus #4 最短路

    题目传送门 北极为什么会有企鹅啊,而且北纬91°在哪啊? 关键在建图 因为任意两个城市间都可以互相到达,再加上还有"快捷通道",光是建图就已经\(\rm{T}\)了-- 但这题给了 ...

  8. VMware9虚拟机安装MAC OS X Mountain Lion 10.8.2详细图文教程

    VMware虚拟机安装Mac OS X Mountain Lion 10.8.2所需文件:1.Vmware 9.01版下载:点击进入2.Vmware 9.01版汉化文件:点击进入3.VMware Wo ...

  9. cocos2dx lua 打印和保存日志

    在2d游戏中,经常会出现闪退或者报错的问题,通过写文本,将日志文件发送给服务端,让后端人员进行分析. 通过lua打印日志在文本文件中: local file = io.open(cc.FileUtil ...

  10. C#:CodeSmith根据数据库中的表创建C#数据模型Model + 因为没有钱买正版,所以附加自己写的小代码

    对于C#面向对象的思想,我们习惯于将数据库中的表创建对应的数据模型: 但假如数据表很多时,我们手动增加模型类会显得很浪费时间: 这个时候有些人会用微软提供的EntityFrameWork,这个框架很强 ...