C++刷题篇——06整理扑克牌

一、题目

二、解题思路

特别注意多组三张两张组合的情况

具体思路的见代码注释部分

三、代码 

#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>

using namespace std;

vector<int>split(string params) {
	vector<int>p;
	while (params.find(" ") != string::npos) {
		int found = params.find(" ");
		p.push_back(stoi(params.substr(0, found)));
		params = params.substr(found + 1);
	}
	p.push_back(stoi(params));
	return p;
}

bool comp20(vector<int>a, vector<int>b) { //先按出现次数降序,次数相同则字典降序
	if (a[1] == b[1]) {
		return a[0] > b[0];
	}
	else {
		return a[1] > b[1];
	}
}

bool comp201(vector<int>c, vector<int>d) { //直接按从大到小排
	return c[0] > d[0];
}

bool comp202(int c, int d) { //直接按从大到小排
	return c > d;
}

int main() {
	string input_str;
	getline(cin, input_str);

	vector<int>input_vec = split(input_str);

	//key为扑克牌大小,value为数量
	map<int, int>input_map;
	for (int i = 0; i < input_vec.size(); i++) {
		if (input_map.count(input_vec[i])) {
			input_map[input_vec[i]]++;
		}
		else {
			input_map[input_vec] = 1;
		}
	}

	vector<int>temp;
	vector<vector<int>>temp1;
	for (auto x : input_map) {
		temp.push_back(x.first);
		temp.push_back(x.second);
		temp1.push_back(temp);
		temp.clear();
	}
	sort(temp1.begin(), temp1.end(), comp20); //按照value降序排列

	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int e = 0;
	vector<int>res;
	vector<int>res1;
	vector<int>res2;
	for (int i = 0; i < temp1.size(); i++) {
		if (temp1[i][1] == 4) { //最大有四张,直接输出
			a++;
			for (int j = 0; j < 4; j++) {
				res.push_back(temp1[i][0]);
			}
			for (int j = 0; j < 4; j++) {
				res1.push_back(temp1[i][0]);
			}
		}
		else if (temp1[i][1] == 3) {
			b++;
			for (int j = 0; j < 3; j++) {
				res.push_back(temp1[i][0]);
			}
		}
		else if (temp1[i][1] == 2) {
			c++;
			for (int j = 0; j < 2; j++) {
				res.push_back(temp1[i][0]);
			}
		}
		else if (temp1[i][1] == 1) {
			d++;
			for (int j = 0; j < 1; j++) {
				res.push_back(temp1[i][0]);
			}
			res2.push_back(temp1[i][0]); //同时记录单张的情况
		}
	}

	for (int i = 0; i < a; i++) {
		temp1.erase(temp1.begin()); //四张的都放进数组了,故而移除
	}
	for (int i = 0; i < d; i++) {
		temp1.erase(temp1.begin() + temp1.size() - 1); // 单张的都放进数组了,故而移除
	}

	//此刻的temp1已经只有三张和两张的情况
	if (b == 0 || b == 1) { //这种情况不用考虑葫芦,或者说葫芦的32挨着
		for (int i = 0; i < res.size(); i++) {
			cout << res[i] << " ";
		}
	}
	else { //有多组三张和两张的情况
		while (temp1.size() != 0) {
			if (temp1[0][1] == 3) { //防止出现三张的没两张多的情况,只有可能出现三带二才进入下面
				for (int j = 0; j < 3; j++) { //先将排序后的前三张放进res1(res1里已有四张的情况)
					res1.push_back(temp1[0][0]);
				}
				temp1.erase(temp1.begin()); //放进后就移除
				sort(temp1.begin(), temp1.end(), comp201); //由于要三带二,所以对剩余的不管张数,直接按大小排
				if (temp1[0][1] == 3) { //排完后,倘若首位还为三张
					for (int j = 0; j < 2; j++) {
						res1.push_back(temp1[0][0]); //前两张放进res1
					}
					res2.push_back(temp1[0][0]); //最后零的一张放进res2(res2里已有最早遍历时单张的情况)
					temp1.erase(temp1.begin());//放进后就移除
				}
 				else { //倘若首位为两张
					for (int j = 0; j < 2; j++) {
						res1.push_back(temp1[0][0]); //那么直接放进res1
					}
					temp1.erase(temp1.begin());
				}
				sort(temp1.begin(), temp1.end(), comp20); //找出第一个三带二后,按照原来的逻辑排序
			}
			else { //已经移除到首位不为三张的情况
				for (int j = 0; j < 2; j++) {
					res1.push_back(temp1[0][0]); //前两张放进res1
				}
				temp1.erase(temp1.begin());
			}
		}
		sort(res2.begin(), res2.end(), comp202);
		for (int i = 0; i < res2.size(); i++) {
			res1.push_back(res2[i]);
		}
		for (int i = 0; i < res1.size(); i++) {
			cout << res1[i] << " ";
		}
	}
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/505347.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2-Prometheus监控主机

文章目录 1 介绍2 部署2.1 下载2.2 解压到指定目录2.3 配置进程管理2.4 程序启动参数2.5 启动和监听 3 添加到 Prometheus4. 指标4.1 通过页面查看指标数据4.2 查看都有哪些指标4.3 指标数据规范 5 程序运行参数 1 介绍 Prometheus 使用 node_exporter 服务程序监控 Linux 主机…

【前端面试3+1】07vue2和vue3的区别、vue3响应原理及为什么使用proxy、vue的生命周期中在什么时期给接口发请求、【找出数组最大公约数】

一、vue2和vue3的区别 1.性能优化&#xff1a; Vue 3在性能方面有很大的提升&#xff0c;主要是通过虚拟DOM的优化和响应式系统的改进实现的。 虚拟 DOM 重构&#xff1a;Vue 3 中对虚拟 DOM 进行了重构&#xff0c;使得更新算法更加高效&#xff0c;减少了更新时的开销&#x…

LCX端口转发

LCX介绍 LCX是一款端口转发工具&#xff0c;分为Windows版和Linux版&#xff0c;Linux版本为PortMap。LCX有端口映射和端口转发两大功能&#xff0c;例如当目标的3389端口只对内开放而不对外开放时&#xff0c;可以使用端口映射将3389端口映射到目标的其他端口使用&#xff1b…

iOS问题记录 - App Store审核新政策:隐私清单 SDK签名(持续更新)

文章目录 前言开发环境问题描述问题分析1. 隐私清单 & SDK签名1.1. 隐私清单 - 数据使用声明1.2. 隐私清单 - 所用API原因描述1.3. SDK签名 2. 即将发布的第三方SDK要求 解决方案最后 前言 前段时间用Flutter开发的iOS App提交了新版本&#xff0c;结果刚过两分钟就收到了…

属性选择器

1.[title]{background:yellow;}&#xff1a;所有带title标签设置成黄色 2.div[class]{background:yellow;}&#xff1a;所有div中带class标签设置成黄色 3.div[classbox1]{border:1px solid blue; }&#xff1a;div中包含class并且classbox1的设置成蓝边框 4. class…

【春秋云镜】CVE-2023-7106标靶Wp

0x01&#xff1a;漏洞点 老样子先&#xff0c;看看标题介绍奥 ok了解到了 我们现在要知道参数是prod_id&#xff0c;路径为/pages/product_details.php 0x02&#xff1a;操作 直接打开SQLmap一把梭 sqlmap -u {URL}/pages/product_details.php?prod_id1 --current-db 这里…

文件操作详解(一)

目录 一.文件的类型1.数据文件2.程序文件3.文件名 二. 二进制文件三.文本文件四. 文件的打开&#xff08;fopen&#xff09;和关闭&#xff08;fclose&#xff09;1.1流是什么1.2标准流 2.文件指针 一.文件的类型 存储在硬盘上的是文件&#xff0c;文件分为数据文件和程序文件…

上岸美团了!

Hello&#xff0c;大家好&#xff0c;最近春招正在如火如荼&#xff0c;给大家分享一份美团的面经&#xff0c;作者是一份某双非的硕&#xff08;只如初见668&#xff09;&#xff0c;刚刚通过了美团的3轮面试&#xff0c;已经拿到offer&#xff0c;以下是他的一些分享。 一面&…

9.处理消息边界

网络编程中消息的长度是不太确定的&#xff0c;read方法读取字节数据到ByteBuffer中&#xff0c;ByteBuffer会有一个固定容量&#xff0c;单次超出容量的部分字节数据将会在下一次的ByteBuffer中&#xff0c;这样消息就会按照字节截断&#xff0c;出现消息边界问题。 Http 2.0 …

【pytest、playwright】多账号同时操作

目录 方案实现思路&#xff1a; 方案一&#xff1a; 方案二&#xff1a; 方案实现思路&#xff1a; 依照上图所见&#xff0c;就知道&#xff0c;一个账号是pytest-playwright默认的环境&#xff0c;一个是 账号登录的环境 方案一&#xff1a; 直接上代码&#xff1a; imp…

gtsam::Pose3的compose()函数作用

#include <gtsam/geometry/Pose3.h> #include <iostream> int main(int argc, char** argv) {// B 的旋转量为绕 x 轴旋转 180 度gtsam::Pose3 B gtsam::Pose3(gtsam::Rot3(0, 1, 0, 0), gtsam::Point3(1, 2, 0));// A 的旋转量为绕 z 轴旋转 180 度gtsam::Pose3 A…

MySQL中如何进行多表查询

目录 一、子查询 1.什么是子查询 2.注意事项 二、联结查询 1.什么是联结 2.内部联结&#xff08;等值联结&#xff09; ①WHERE语句 ②ON语句 3.自联结 4.自然联结 5.外部联结 三、组合查询 1.什么是组合查询 2.UNION规则 *本节涉及概念来源于图灵程序设计丛书&a…

latex伪代码一些记录

参考一 参考二 参考三 使用minipage 最终调整好的效果&#xff1a; $ \begin{document} \begin{center} \begin{minipage}{15.92cm} \renewcommand{\thealgorithm}{1} \begin{CJK}{GBK}{song} \begin{algorithm}[H]\caption{ \text{算法1&#xff1a;xxx}}\begin{algorith…

基于SpringBoot和Vue的学生笔记共享平台的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的学生笔记共享平台的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&…

Linux中断管理:(一)中断号的映射

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 中断控制器 Linux 内核支持众多…

TCP通信——端口转发(重点内容)

实现多人群聊 Client(客户端&#xff09;建立通信 package com.zz.tcp.case1;import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner;public class Client {public static void mai…

Java- maven下载jar包,提示找不到,Could not find artifact

1、执行下面命令行 mvn install:install-file -Dfile/home/quangang/桌面/isv-sdk-2.0.jar -DgroupIdcom.jd -DartifactIdisv-sdk -Dversion2.0 -Dpackangjar 2、然后这里要加上jar包

Linux(CentOS 7 )基于git、maven实现springboot自动化部署

前提 1、已安装git、maven、java环境 不清楚的可以看另一篇文章&#xff1a; https://blog.csdn.net/weixin_44646763/article/details/137041469 2、已为项目设置远程 git 仓库 origin (可以通过&#xff1a;git remote add origin https://github.com/xxx/xxx.git设置) 创…

MCRNet:用于乳腺超声成像语义分割的多级上下文细化网络

MCRNet&#xff1a;用于乳腺超声成像语义分割的多级上下文细化网络 摘要引言方法 MCRNet_ Multi-level context refinement network for semantic segmentation in breast ultrasound imaging 摘要 由于对比度差、目标边界模糊和大量阴影的不利影响&#xff0c;乳腺超声成像中…

基于ssm校园教务系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园教务信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…