2024CSP-J题目简析

news2024/10/28 7:03:14

扑克牌

1.题目大意:给定n张扑克牌和这n张扑克牌的花色和大小(可能会有重复),需要输出还需要多少张牌才能凑齐一副扑克牌(这里不考虑大小王,所以共52张)。

2.思路概要:由于扑克牌会有重复,所以重要的操作就是字符串的处理和去重。这里先介绍下unique,它的作用是“去掉”容器中相邻元素的重复元素。(这里去掉要加一个引号,是因为实质上是一个伪去除,它会把重复的元素添加到容器末尾,而返回值是去重之后的尾地址。)这道题并不难,所以也不过多赘述。

3.代码实现:

#include<bits/stdc++.h>
using namespace std;
const int N=60;
int n;
string s[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>s[i];
	sort(s+1,s+1+n);
	n=unique(s+1,s+1+n)-1-s;
	cout<<52-n;
	return 0;
} 

地图探险

1.题干可能有点长,但不是很难理解。给定一个n*m的地图,地图中"."可以通过,"x"不能通过,机器人的初始坐标为(x0,y0),朝向为d0,(d=0代表向东,d=1 代表向南,d=2 代表向西,d=3 代表向北)如果机器人正对的方向可以走,那它就向前走一步,但是朝向不变,如果不可以走的话就向右转,即d'=(d+1)%4,但是位置保持不变。最后需要输出在机器人执行完 k 步操作之后,地图上所有被机器人经过的位置(包括起始位置)有几个。

2.这道题是模拟题,(可能有人会当成搜索),简单讲解下易错点,设置两个位移数组 dx[]={0,1,0,-1},dy[]={1,0,-1,0},从而简便地完成转向移动。(需要注意下坐标名称的命名,y1如果是全局变量的话,在万能头的情况下会编译错误),这种题坐标名称很容易弄混需要区分开。由于一组样例有多组数据,所以记得清空数组。还有需要注意的是,向右转也是一步,一个格子最多算一遍。

3.代码实现:

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
bool vis[N][N];
char ch[N][N];
void solve(){
	int n,m,k,x0,y0,d0;
	memset(vis,0,sizeof(vis));
	cin>>n>>m>>k;
	cin>>x0>>y0>>d0;
	for(int i=1;i<=n;i++){
		char s[N];
		cin>>s;
		for(int j=1;j<=m;j++){
			ch[i][j]=s[j-1];
		}
	}
	vis[x0][y0]=true;
	for(int i=1;i<=k;i++){
		int x1=x0+dx[d0],y1=y0+dy[d0];
		if(x1>=1&&x1<=n&&y1>=1&&y1<=m&&ch[x1][y1]=='.'){
			x0=x1;
			y0=y1;
		}
		else d0=(d0+1)%4;
		vis[x0][y0]=true;
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ans+=vis[i][j];
		}
	}
	cout<<ans<<endl;
}
int main(){
	int T;
	cin>>T;
	while(T--){
		solve();
	}
    return 0;
}

小木棍

1.题目简述:给定一个自然数 n,使这 n 根木棍能摆出最小得数(不含前导 0)。

2.思路简析:先通过打n%7的余数的打表找一找特殊性质:

        余数为 0:答案为n÷7个8。

        余数为1:n=1特判,无答案输出-1。剩下的答案为10拼接(n-8)/7个8。

        余数为2:答案为1拼接(n-2)/7个8。

        余数为3:n=3特判,答案为7。n=10特判,答案为22。剩下的为200拼接(n-17)/7个8

        余数为4:n=4特判,答案为4。剩下的为20拼接(n-11)/7个8。

        余数为5:答案为2拼接(n-5)/7个8。

        余数为6:答案为6拼接(n-6)/7个8。

3.代码实现:

#include<bits/stdc++.h>
using namespace std;
long long n,t;
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		if(n==1) cout<<-1;
		else if(n==2) cout<<1;
		else if(n==3) cout<<7;
		else if(n==4) cout<<4;
		else if(n==5) cout<<2;
		else if(n==6) cout<<6;
		else if(n==7) cout<<8;
		else if(n%7==0) for(int i=1;i<=n/7;i++) cout<<8;
		else if(n%7==1){
			cout<<10;
			for(int i=1;i<=(n-8)/7;i++) cout<<8;
		}
		else if(n%7==2){
			cout<<1;
			for(int i=1;i<=(n-2)/7;i++) cout<<8;
		}
		else if(n%7==3){
			if(n==10) cout<<22;
			else{
				cout<<200;
				for(int i=1;i<=(n-17)/7;i++) cout<<8;
			}
		}
		else if(n%7==4){
			cout<<20;
			for(int i=1;i<=(n-11)/7;i++) cout<<8;
		}
		else if(n%7==5){
			cout<<2;
			for(int i=1;i<=(n-5)/7;i++) cout<<8;
		}
		else if(n%7==6){
			cout<<6;
			for(int i=1;i<=(n-6)/7;i++) cout<<8;
		}
		cout<<"\n";
	}
	return 0;
}

接龙

(该说不说,T3T4题干都挺长的哈)

应该能想到是动态规划题。

先想一想暴力dp,为了避免多维的状态定义,我们把每个人的子序列化为长度最多为 2×10^5 的一维序列,并记录下每一张牌对应的人是谁。记这个一维序列的长度为 tot,显然tot=\sum_{i=1}^{n}l_{i}。定义dp[i][j]表示当前进行到第 i 轮,且该轮以一维序列中的第 j 张牌结尾是否可行。状态转移:遍历第 j 张牌的前面 k−1 张牌(必须要是同一个人的),假设某张前面的牌所写的数字为 x,那么就可以遍历 r−1 层中不是同一个人的且值为 x 的人的牌转移过来,只要这些牌中有一个的结果为 1,那么第 j 张牌的值就是 1。

优化:注意到有一个限制是“不能从同一个人那里转移过来”,可以记录两个属于不同人的且可以转移过来的牌。只要这两张牌中,有一张和现在的牌所属的人不同,就是可以转移过来的。这个可以通过在每一轮结束之后预处理一遍得到。

进一步优化:观察到一个数的结果为 1,当且仅当前 k−1 位的预处理值中有一个可以转移。可能会想到单调队列优化进行转移。但这是普及组,不能考单调队列。于是我们换一种普及组思路。因为这题可以预处理,而查询操作是查询 l 到 r 之间有没有元素 1,因此预处理之后再前缀和一下就能做到 O(1) 查询有没有元素 1 了。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int T,n,k,q;
int l[N],xx[N],yy[N],dp[N][110];
vector<int>v[N];
int main(){
	cin>>T;
	while(T--){
		cin>>n>>k>>q;
		int maxl=0,maxr=0;
		for(int i=1;i<=n;i++){
			cin>>l[i];
			v[i].clear();
			for(int j=1;j<=l[i];j++){
				int x;
				cin>>x;
				maxl=max(maxl,x);
				v[i].push_back(x);
			}
		}
		for(int i=1;i<=q;i++){
			cin>>xx[i]>>yy[i];
			maxr=max(maxr,xx[i]);
		}
		for(int i=0;i<=maxl;i++){
			for(int j=0;j<=maxr;j++){
				dp[i][j]=-1;
			}
		}
		dp[1][0]=0;
		for(int i=1;i<=maxr;i++){
			for(int j=1;j<=n;j++){
				int x=-1;
				for(int k1=0;k1<v[j].size();k1++){
					int t1=v[j][k1];
					if(k1>=k){
						int t2=v[j][k1-k];
						if(dp[t2][i-1]!=-1&&dp[t2][i-1]!=j&&x==k1-k) x=-1;
					}
					if(x!=-1){
						if(dp[t1][i]==-1)dp[t1][i]=j;
						else if(dp[t1][i]!=j)dp[t1][i]=0;
					}
					if(dp[t1][i-1]!=-1&&dp[t1][i-1]!=j)x=k1;
				}
			}
		}
		for(int i=1;i<=q;i++){
			if(yy[i]>maxl)cout<<"0";
			else cout<<(dp[yy[i]][xx[i]]!=-1);
			puts("");
		}
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第513题找树左下角的值

题目&#xff1a; 题解&#xff1a; class Solution { public:int findBottomLeftValue(TreeNode* root) {int ret;queue<TreeNode *> q;q.push(root);while (!q.empty()) {auto p q.front();q.pop();if (p->right) {q.push(p->right);}if (p->left) {q.push(…

配置smaba (Linux与windows通信)

在Ubuntu上安装Samba是一个简单的过程。以下是详细的步骤&#xff0c;帮助你从安装到基本配置。 步骤1&#xff1a;更新软件包列表 首先&#xff0c;打开终端&#xff0c;确保你的软件包列表是最新的&#xff1a; sudo apt update 步骤2&#xff1a;安装 Samba 接下来…

若依学习 后端传过来的数据在控制台打印为空

导言: 在做若依二次开发时遇到个没见过的bug&#xff0c;用了一些时间排&#xff0c;发现有自己没学过的东西。所以记录一下。后端用的是c#的asp.net core 问题描述&#xff1a; 后端穿过来的有数据的参数(数组)roleIds在控制台打印为空 后端字段定义: 后端数据&#xff1a; 前…

centos-LAMP搭建与配置(论坛网站)

文章目录 LAMP简介搭建LAMP环境安装apache&#xff08;httpd&#xff09;安装mysql安装PHP安装php-mysql安装phpwind LAMP简介 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1a;Linux操作系统&#xff0c;网页服务器Apache&#xff0c;…

【LangChain系列3】【检索模块详解】

目录 前言一、LangChain1-1、介绍1-2、LangChain抽象出来的核心模块1-3、特点1-4、langchain解决的一些行业痛点1-5、安装 二、检索模块详解2-1、文档加载器2-1-1、Demo示例2-1-2、JSON加载2-1-3、CSV加载 2-2、文档转换器2-2-1、按字符进行拆分2-2-2、按代码分割2-2-3、Markdo…

arm 体系架构-过程调用标准AAPCS

一、什么是AAPCS&#xff1f; 旧时&#xff0c;ARM 过程调用标准叫做 APCS (ARM Procedure Call Standard)&#xff0c;Thumb的过程调用标准为 TPCS。如今这两种叫法已经废弃&#xff0c;统一称作 AAPCS (Procedure Call Standard for the ARM Architecture)。 AAPCS 是 ARM …

UE5之5.4 第三人称示例代码阅读

第三人称的代码相对第一人称少了很多&#xff0c;只有一个移动跳跃的能力 构造函数&#xff0c;添加角色的移动属性&#xff0c;限制了当controller移动角色不会乱转&#xff0c;然后创建了一个相机杆&#xff0c;创建了一个跟随相机&#xff0c;绑到相机杆上 然后在这个函数设…

用二分法查找有序容器的插入点

例子&#xff1a; int main() {vector<int> vec { 1,2,3,4,5,7,8,9 };auto n alg.find_binary_insert_pos(vec.begin(), vec.end(), 6);vec.insert(vec.begin() n, 6);_pn(vec);list<int> lst { 1,10,11,9,5 };for (auto& v : lst) {//添加不存在的元素au…

241024-Ragflow离线部署Docker-Rootless环境配置修改

A. 最终效果 B. 文件修改 docker-compose.yml include:- path: ./docker-compose-base.ymlenv_file: ./.envservices:ragflow:depends_on:mysql:condition: service_healthyes01:condition: service_healthyimage: ${RAGFLOW_IMAGE}container_name: ragflow-serverports:- ${…

D50【python 接口自动化学习】- python基础之类

day50 init方法 学习日期&#xff1a;20241027 学习目标&#xff1a;类 -- 64 init方法&#xff1a;如何为对象传递参数&#xff1f; 学习笔记&#xff1a; 魔术方法 init方法 class Klass(object):# 定义初始化方法&#xff0c;类实例化时自动进行初始化def __init__(self…

autMan框架的指令转换功能学习

以正则表达式为基础 一、基本用法【简单替换】 示例1&#xff1a; 匹配表达式&#xff1a;激活 结果表达式&#xff1a;咖啡码 效果&#xff1a;只要命令中包含“激活”这两个字&#xff0c;就会将命令中所有的“激活”替换为“咖啡码”&#xff0c;即你从后台看到收到的命令是…

leetcode-64-最小路径和

题解&#xff1a; 以题中矩阵为例&#xff1a; &#xff08;1&#xff09;走到grid[0][0]的最小距离就是起点grid[0][0]即dp[0][0]grid[0][0]; &#xff08;2&#xff09;走到grid[0][1]的最小距离&#xff1a;dp[0][1]grid[0][0]grid[0][1]; &#xff08;3&#xff09;走到…

《神经网络助力战场车辆及部件损毁识别与评估》

《神经网络助力战场车辆及部件损毁识别与评估》 一、战场车辆损毁评估的重要意义二、传统战场车辆损毁评估方法&#xff08;一&#xff09;视觉评估法&#xff08;二&#xff09;仪器检测技术 三、神经网络在战场车辆损毁评估中的应用案例&#xff08;一&#xff09;射击毁伤评…

WPF+MVVM案例实战(七)- 系统初始化界面字体描边效果实现

文章目录 1、案例效果展示2、项目准备3、功能实现1、资源获取2、界面代码3、后台代码 4 源代码获取 1、案例效果展示 2、项目准备 打开项目 Wpf_Examples&#xff0c;新建系统初始化界面 WelcomeWindow.xmal,如下所示&#xff1a; 3、功能实现 1、资源获取 案例中使用的CSD…

VMware Workstation Pro 17 安装 Centos 7.9 虚拟机

下面以使用VMware Workstation Pro 17.5.2版本进行安装&#xff0c;CentOS版本为7.9&#xff0c;7.x的原来很多地址失效了&#xff0c;因为旧版移到了vault目录。为了方便大家整理可用的下载地址&#xff1a;清华大学镜像站 新建虚拟机 下面是填写的虚拟机的名称和路径&#x…

拴柱说Mac之Mac的高效使用技巧第二期

Mac的触控板想必大家都会使用&#xff0c;比如三指拖移窗口&#xff0c;四指切换桌面&#xff0c;触控板能做到的其实更多&#xff0c;今天的高效使用技巧讲的就是触控板&#xff0c;如何才能让你的触控板更加的好用 第一步&#xff0c;官网下载BetterAndBetter 第二步&#…

部署前后端分离若依项目--CentOS7Docker版

一、准备 centos7虚拟机或服务器一台 若依前后端分离项目&#xff1a;可在下面拉取 RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 二、环…

【Python爬虫】获取汽车之家车型配置附代码(2024.10)

参考大哥&#xff0c;感谢大哥&#xff1a;https://blog.csdn.net/weixin_43498642/article/details/136896338 【任务目标】 工作需要想更方便地下载汽车之家某车系配置清单&#xff1b;&#xff08;垃圾汽车之家不给下载导出表格&#xff0c;配置页叉掉了车系要出来还要重新…

软件测试知识点汇总

第一部分:(软件)测试概念类 1、软件质量 软件质量是“软件满足规定或潜在用户需求特性的总和”。 反映出如下3方面的问题: 1)软件需求是度量软件质量的基础。不符合需求的软件就不具备质量。 2)软件人员必须遵循软件过程规范,用工程化的方法来开发软件。 3)满足一…

利用ADPF性能提示优化Android应用体验

Android Dynamic Performance Framework(ADPF)是google推广的一套用于优化散热以及CPU性能的动态性能框架。本文主要介绍其中的performance hint的部分。 1、为何引入ADPF 我们都知道&#xff0c;在大多数设备上&#xff0c;Android 会动态调整CPU的频率和核心类型。如果work l…