csp-j/s模拟题详细题解

这篇具有很好参考价值的文章主要介绍了csp-j/s模拟题详细题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

装水

题目详情

题目描述
一天小理买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着小理发现瓶子实在太多了,于是他决定保留不超过K个瓶子,每次他选择两个当前含水量相同的瓶子合并。(即把一个瓶子的水全部倒进另一个里然后把空瓶丢弃)

(注:不能丢弃有水的瓶子)

显然在某些情况下小理无法达到目标,比如N = 3, K = 1。此时小理会重新购买一些新的瓶子(新瓶子容量无限,开始时有1升水)以达到目标。

现在小理想知道最少需要多少新瓶子才能达到目标呢?

输入格式
一行两个正整数N和K,含义见题。

输出格式
输出文件包含一个非负整数,表示最少需要购买的瓶子数量。

1.4 测试样例
1.4.1 样例输入1(water.in)
3 1
1.4.2 样例输出1(water.out)
1
1.4.3 样例输入2(water.in)
13 2
2
CSP-J 模拟题 执理OI
1.4.4 样例输出2(water.out)
3
1.4.5 样例输入3(water.in)
1000000 5
1.4.6 样例输出3(water.out)
15808
1.5 任务约束
对于50%的数据,保证1 ⩽ n ⩽ 10^7
对于100%的数据,保证1 ⩽ n ⩽ 10^9, 0 ⩽ k ⩽ 1000

AC代码

这道题只需要将瓶子数转化为2进制看看里面包含多少个1即可,例如13的二进制是1101,16的二进制是10000,只有一个1,小于输入的2,所以最终答案就是16-13,所以这道题的难点就在于如何不超时传化二进制

代码1(90分)

可以用到__builtin_popcount(n)来做到快速计算二进制的1的个数
代码如下

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
	//freopen("water.in","r",stdin);
	//freopen("water.out","w",stdout);
	int n,k;
	cin >> n >> k;
	int ans = 0;
	while(__builtin_popcount(n) > k){
		ans++;
		n++;
	}
	cout << ans << endl;
	return 0;
}

如果不会的话手写也是可以的

代码2(90分)

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;

int count(int x){//这里的作用是一样的
	int s=0;
	while(x){
		if(x%2) s++;
		x/=2;
	}
	return s;
}

int main()
{
	int n,k;
	cin >> n >> k;
	int ans = 0;
	while(count(n) > k){
		ans++;
		n++;
	}
	cout << ans << endl;
	return 0;
}

怎么做到ac呢?

代码3(AC)

代码如下

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;

int count(int x){
	int s=0;
	while(x){
		if(x%2) s++;
		x/=2;
	}
	return s;
}

int lowbit(int x){
	return x&-x;
}

int main()
{
	int n,k;
	cin >> n >> k;
	int ans = 0;
	while(count(n) > k){
		ans+=lowbit(n);//直接寻找二进制最后一个1的位置,这样做不会超时
		n+=lowbit(n);
	}
	cout << ans << endl;
	return 0;
}

和数(sum)

题目详情

2.1 问题描述
小理对数字之美的追求不局限于质数了,他发现了一种非常靓丽的数字,
并命名为「和数」。「和数」就是能表示为一些互不相同的整数的阶乘之和的
数。如9 = 1! + 2! + 3!。
现在给定一个非负整数n,要求判断n是否为「和数」。
如果是,则输出“YES”,否则输出“NO”(引号不输出)。
2.2 输入格式
每行一个非负整数n,最后一行是一个负数,作为输入的结束。
2.3 输出格式
对于每个非负整数n,在输出文件中分别输出“YES”或“NO”,各占1行。
2.4 测试样例
2.4.1 输入文件(sum.in)
9
5
-1
2.4.2 输出文件(sum.out)
YES
NO
2.5 任务约束
对于20%的数据,保证n ⩽ 10000
对于60%的数据,保证n ⩽ 100000
对于所有的数据,保证n ⩽ 1000000

AC代码

可以发现所有的数字都是由1-10中的数字组成的,所以只需要看他们是否可以被1-10中小于等于他们的数字减完等于0,如果等于就是yes,否则是no

#include<cmath>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[1006];
int n,wc=0;
int ans[100006];
int main(){
	//freopen("sum.in","r",stdin);
	//freopen("sum.out","w",stdout);
	a[0]=1;
	for(int i=1;i<=11;i++)
		a[i]=a[i-1]*i;
	while(cin>>n){		
		if(n<0){//注意题目要求,输入负数结束程序
			break;
		}
		if(n==0){//特判下
			cout<<"NO"<<endl;
			continue;
		}
		for(int i=10;i>=0;i--){
			if(n>=a[i]) n-=a[i];
		}
		wc++;
		if(n==0){
			ans[wc]=1;
			continue;		
		}else{
			ans[wc]=0;
			continue;
		}
	}
	for(int i=1;i<=wc;i++){//我这里单独记录了答案输出,边做边输出也是可以的,不用在意(一开始不停的wa,以为是输出格式的问题......)
		if(i==wc){
			if(ans[i]){
				cout<<"YES";
			}else{
				cout<<"NO";
			}	
		}else
			if(ans[i]){
				cout<<"YES"<<endl;
			}else{
				cout<<"NO"<<endl;
			}
	}
} 


解方程(equationagain)

题目详情

3.1 问题描述
小理学习了计算机编程之后,他发现运用编程可以轻松结局令他头疼的一
元一次方程问题,于是他准备编一个程序用于解方程。
给出一个字符串,表达一个方程。
数据保证方程有且只有一个解,而且方程只会有一个未知数X,且X的最
高指数也只会有1。方程中所有的系数都是整数,且系数是1就会被省略。只会
出现加、减符号,不会出现乘、除。
3.2 输入格式
输入一个字符串表示方程。
3.3 输出格式
输出X的解,保留三位小数。
3.4 测试样例
3.4.1 输入文件(equationagain.in)
6x+7x+8x+1=6x+7x+9x
3.4.2 输出文件(equationagain.out)
1.000
3.5 任务约束
对于10%的数据,输入满足ax = b 的形式
对于另外的30%的数据,含未知数的参数仅一项
对于另外的10%的数据,未知数仅出现在等号左边且符号仅为加号
对于另外的10%的数据,未知数仅出现在等号左边
对于100%的数据,保证字符串的长度不会超过255

AC代码

#include<cmath>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char a[10006]; 
int main(){
	//freopen("equationagain.in","r",stdin);
	//freopen("equationagain.out","w",stdout);
	cin>>a;
	int c=strlen(a);
	int wc=0;
	for(int i=0;i<=c;i++){
		if(a[i]=='('){
			wc=1;
			c-=1;
			for(int j=i;j<=c;j++){
				a[j]=a[j+1];
			}
		}
		if(a[i]==')'){
			wc=0;
			c-=1;
			for(int j=i;j<=c;j++){
				a[j]=a[j+1];
			}
		}
		if(wc){
			if(a[i]=='+'){
				a[i]='-';
			}else if(a[i]=='-'){
				a[i]='+';
			}

		}
	}
	a[c]='-';
	int fg=0;
	double wcc=0;
	double x=0,y=0;
	int p=1;
	for(int i=0;i<=c;i++){
		if(a[i]=='x'&&(a[i-1]!='9'&&a[i-1]!='8'&&a[i-1]!='7'&&a[i-1]!='6'&&a[i-1]!='5'&&a[i-1]!='4'&&a[i-1]!='3'&&a[i-1]!='2'&&a[i-1]!='1'&&a[i-1]!='0'))//这里用isdigit(n)更方便,这个是判断字符是不是数字的
		{
			wcc=1;
		}
		if (isdigit(a[i]))
			wcc=wcc*10+(a[i]-'0');
		if((a[i-1]<='9'&&a[i-1]>='0')&&(a[i]=='-'||a[i]=='+'||a[i]=='=')){
			wcc=wcc*p;
			if(!fg){
				y=y-wcc;	
			}else{
				y=y+wcc;
			}
			wcc=0;
		}else if(a[i]=='x'){
			wcc=wcc*p;
			if(!fg){
				x+=wcc;
			}else{
				x-=wcc;
			}
			wcc=0;	
		}
		if(a[i]=='+'||a[i]=='='||a[i]=='-'){
			if(a[i]=='-'){
				p=-1;
			}else {
				p=1;
			}}	
		if(a[i]=='='){
			fg=1;
		}
	}
	double ww;
	ww=y/x;
	printf("%.3lf\n",ww);
} 

溜乌龟(tortoise)

题目详情

4.1 问题描述
乌龟们在被划分成N行M列的草地上游走。
设S为乌龟在T秒内从(R1,C1)走到(R2,C2)所能选择的路径总数,每一秒
内,乌龟会水平或垂直地移动1单位距离(乌龟总是在移动,不会在某秒内停在
它上一秒所在的点)。草地上的某些地方有树,自然,乌龟不能走到树所在的
位置,也不会走出草地。
现在你拿到了一张整块草地的地形图,其中.表示平坦的草地,∗表示挡路
的树。你的任务是计算出,乌龟在T秒内从(R1,C1)移动到(R2,C2)可能经过的
路径条数。
4.2 输入格式
第1行: 3个用空格隔开的整数:N,M,T
第2…N+1行: 第i+1行为M个连续的字符,描述了草地第i行各点的情况,保
证字符是.和*中的一个
第N+2行: 4个用空格隔开的整数:R1,C1,R2,以及C2。
4.3 输出格式
输出S,表示乌龟在T秒内从(R1,C1)移动到(R2,C2)可能经过的路径条数。
4.4 测试样例
以文件形式下发
4.5 任务约束
对于10%的数据,保证地图中没有「挡路的树」
对于另外60%的数据,2 ⩽ N, M ⩽ 20
对于100%的数据,2 ⩽ N ⩽ 100; 2 ⩽ M ≤ 100; 0 < T ≤ 15

AC代码

记忆化搜索完事

#include<cmath>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int tx[5]={0,1,-1,0,0};
int ty[5]={0,0,0,1,-1};
int t,x,y,x1,y11;
int mapp[1000][1000];
int n,m;
struct node{
	int x,y,st;
};
int dp[101][101][20];
void bfs(int xx,int yy){
	queue<node> q;
	q.push((node){xx,yy,0});
	dp[xx][yy][0]=1;
	while(!q.empty()){
		node c;
		c=q.front();
		for(int i=1;i<=4;i++){
			int dx=c.x+tx[i];
			int dy=c.y+ty[i];
			int dt=c.st+1;
			if(dp[dx][dy][dt])
				dp[dx][dy][dt]+=dp[c.x][c.y][c.st];
			if(dx>0&&dy>0&&dx<=n&&dy<=n&&mapp[dx][dy]==0){
				dp[dx][dy][dt]+=dp[c.x][c.y][c.st];
				q.push((node){dx,dy,dt});
			} 
		}
	}
}
int main(){
	//freopen("tortoise.in","r",stdin);
	//freopen("tortoise.out","w",stdout);
	cin>>n>>m>>t;
	char w;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>w;
			if(w=='*'){
				mapp[i][j]=1;
			}else{
				mapp[i][j]=0;
			}
		}
	}
	cin>>x>>y>>x1>>y11;
	bfs(x,y);
	cout<<dp[x1][y11][t];
}

@^ _ ^@文章来源地址https://www.toymoban.com/news/detail-686855.html

到了这里,关于csp-j/s模拟题详细题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • openstack COA 考试模拟题

    version: 201911 You are the cloud administrator of a fictitious company named ESCloud. You have been tasked with setting up Openstack Environments for marketing and finance departments. Task 1 The company has two departments, named marketing and finance. For each of the two departments create projects with details below: Project Name: marketing finance Descr

    2023年04月19日
    浏览(44)
  • 2023CSP-J题解

    烦死了,这次CSP考的真的垃圾,犯了好多低级错误。 小 Y 的桌子上放着 n n n 个苹果从左到右排成一列,编号为从 1 1 1 到 n n n 。 小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果。 每天在拿的时候,小苞都是从左侧第 1 1 1 个苹果开始、每隔 2 2 2 个苹果拿走 1 1 1 个苹果。

    2024年02月08日
    浏览(55)
  • 蓝桥杯嵌入式--实战模拟题

    在蓝桥杯省赛举办之前,学校组织了一场模拟赛,基于第十三届的省赛题,但是难度略高于省赛,这篇博客记录一下解题的过程,其思路可供大家参考。 详细工程目前先联系我获取。 花个十几分钟把题目好好理解一下,然后先整理出一个大体的运行原理。很容易我们就想到

    2023年04月10日
    浏览(45)
  • pta模拟题——7-34 刮刮彩票

    “刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示: 每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9,数字各不重复,并以 3×3 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可

    2024年02月04日
    浏览(49)
  • hw大一Python模拟题详解

    一、选择题 1、关于Python语言的特点,以下选项描述正确的是( B )。 A.Python语言不支持面向对象。            B.Python语言是解释型语言。 C.Python语言是编译型语言。              D.Python语言是非跨平台语言。 解析: Python 是一种解释型、面向对象、动态数据类型

    2024年01月16日
    浏览(41)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛2]程序设计试题及详细题解

    这次的模拟赛试题模块还是一些常见模块: LCD 、 LED 、 按键 、 定时器 以及 串口 ,相对比较常规,相比于真正的省赛也比较简单。但是它 适合刚刚学完各个模块需要做真题的同学 ,可以借此来巩固自己之前所学;对于已经能够掌握各个模块的同学也是有帮助的,就是平台

    2023年04月13日
    浏览(134)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛1]程序设计试题及详细题解

    模拟赛1的题目中需要的准备的知识点不多,其中只用到了 串口 、 LCD 、 LED 、 按键 、 定时器的PWM输出 、以及 ADC 等几个模块,题目要求也简单详细并且数量不多,非常适合入门比赛,以及整合自己比赛的模块。 与模拟赛2相比,当然是模拟赛2的试题比较难啦,虽然需要的模

    2023年04月13日
    浏览(147)
  • 2022 CSP-J 复赛题解

    【题目描述】 小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a 和 b ,求 a b 的值是多少。 a b 即 b 个 a 相乘的值,例如 23 即为 3 个 2 相乘,结果为 2 × 2 × 2 = 8。 “简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。 小文

    2024年02月07日
    浏览(63)
  • 2022CSP-J2题解

    今天(2022,10,29), C S P − J S CSP-JS C S P − J S 第二轮成功举办, 虽然大部分省市疫情取消 本蒟蒻今天有幸参加CSP,特发入门组题解 小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a a a 和 b b b ,求 a b a^b a b 的值是多少。 a b a^b a b 即 b b b 个 a a a 相乘

    2023年04月08日
    浏览(84)
  • 736. Lisp 语法解析 : DFS 模拟题

    这是 LeetCode 上的 736. Lisp 语法解析 ,难度为 困难 。 Tag : 「DFS」、「模拟」、「哈希表」 给你一个类似 Lisp 语句的字符串表达式 expression ,求出其计算结果。 表达式语法如下所示: 表达式可以为整数, let 表达式, add 表达式, mult 表达式,或赋值的变量。表达式的结果总是

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包