九度oj 题目1363:欢乐斗地主
题目描述:
如果大家玩过欢乐斗地主这个游戏,就一定知道有一个具有“提示”功能的按钮。如果你不知道你现在手里的牌有没有比上家大的牌,并且你也懒得去一张一张地看你手中的牌。这时候你就可以点“提示”按钮,系统会告诉你是否有这样的牌。
如果你是一个喜欢挑战的人,你就一定会想,能不能写一个程序,让它实现欢乐斗地主中的“提示”按钮的功能。
现在,我们把“提示”按钮所具有的功能简化,它只需要找出在上家出的牌是“三带一对”的情况下你手中的牌是否比上家的牌大。
- 输入:
-
每组测试数据可能有多组输入,对于每一组输入,
输入的第一行包括一个整数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:欢乐斗地主的更多相关文章
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- AdonisJs(Node框架)学习总结
先列出作为前端开发人员必须知道的10个NodeJs框架 AdonisJs 一个服务端渲染的MVC框架,它是 Laravel (PHP框架)的一个 NodeJS 版本. 可以安装脚手架工具adonis ...
- js进阶之闭包
1.首先说下什么是闭包,闭:封闭,包:就像我们的包包~:虽然我在扯淡但是也有其道理咯,闭包就有点像java里面的封装一样,包属性和方法都封装到对象内部,在外部通过共有的get.set方法获取或者设置其 ...
- Windows Experience Index
The Windows Experience is still there--even in build 9860. However, the GUI was retired with Window ...
- Ubuntu18.04偏好设置
以下只是我个人的一些偏好设置,会持续更新 一.安装中文输入法和换用中文界面 Ubuntu18.04下安装搜狗输入法 Ubuntu18.04如何从英文界面更改为中文界面 二.更改系统自带设置 1.设置- ...
- LeetCode分类-前400题
1. Array 基础 27 Remove Element 26 Remove Duplicates from Sorted Array 80 Remove Duplicates from Sorte ...
- CMDB API验证
CMDB API验证 为什么做API验证 API验证是防止数据在传输的过程中,保证数据不被篡改 如何设计的API验证 灵感来源于Torando中加密Cookie的源码,主要是生成加密的随机字符串. M ...
- 如何远程连接Windows server上的MySQL服务
废话不多说,直接开干 首先要打开服务器的MySQL端口号:3306(当然,也可以把服务器的防火墙直接关闭,不过不安全) 1.打开服务器管理器,有个高级安全Windows防火墙,下面有一个入站规则, 右 ...
- C++内联函数、宏定义和普通函数的区别
C++内联函数.宏定义和普通函数的区别? 宏定义:在预处理阶段进行简单的文本替换,不会进行参数类型检查: 内联函数:在编译器的时候进行代码插入,编译器会在每次调用内联函数的地方直接将内联函数的内容展开 ...
- 【转】Qt Socket简单通信
最近要用到Qt的Socket部分,网上关于这部分的资料都比较复杂,我在这总结一下,把Socket的主要部分提取出来,实现TCP和UDP的简单通信. 1.UDP通信 UDP没有特定的server端和cl ...
- #ifdef #else #endif #fi #ifndef 的用法
预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短. ...