CSP-J信息学奥赛考试大纲(入门级)以及csp-j模拟题(杰哥系列)

2.1.1计算机基础与编程环境

【1】计算机的基本构成(CPU、内存、I/O设备等)

【1】Windows、Linux等操作系统的基本概念及其常见操作

【1】计算机网络和Internet的基本概念

【1】计算机的历史及其在现代社会中的常见应用

【1】NOI以及相关活动的历史

【1】进制的基本概念与进制转换、字节与字

【1】程序设计语言以及程序编译和运行的基本概念

【1】使用图形界面新建、复制、删除、移动文件或目录

【1】使用Windows系统下的集成开发环境(例如Dev C++等)

【1】使用Linux系统下的集成开发环境(例如Code::Blocks等)

【1】g++、gcc等常见编译器的基本使用

2.1.2 C++程序设计

1.程序基本概念

【1】标识符、关键字、常量、变量、字符申、表达式的概念

【1】常量与变量的命名、定义及作用

【1】头文件与名字空间的定义与理解

【1】编辑、编译、解释、调试等概念理解

2.基本数据类型

【1】整数型:int,long long

【1】实数型:float,double

【1】字符型:char

【1】布尔型:bool

3.程序基本语句

【2】cin语句,scanf语句,cout语句,printf语句,赋值语句,复合语句

【2】if语句,switch语句,多层条件语句

【2】for 语句,while 语句,do while 语句

【3】多层循环语句

4.基本运算

【1】算术运算:加、减、乘、除、整除、求余

【1】关系运算:大于,大于等于,小于,小于等于,等于,不等于

【1】逻辑运算:与(&&)、或(||)、非(!)

【1】变量自增与自减运算

【1】三目运算

【2】位运算:与(&)、或(|)、非(~)异或(^)、左移、右移

5.数学库常用函数

【3】绝对值函数,四舍五入函数,取上整函数,取下整函数,常用三角函数,对数函数,指数函数,平方根函数

6.结构化程序设计

【1】顺序结构、分支结构和循环结构

【1】自顶向下、逐步求精的模块化程序设计

【2】流程图的概念及流程图描述

7.数组

【1】数组定义,数组与数组下标的含义

【1】数组的读入与输出

【2】纯一维数组的综合运用

【3】纯二维数组与多维数组的综合应用

8.字符串的处理

【2】字符数组与字符串的关系

【2】字符数组的综合应用

【2】string类定义、相关函数引用

【3】string类的综合应用

9.函数与递归

【2】函数定义与调用,形参与实参

【3】传值参数与传引用参数·

【2】常量与变量的作用范围

【2】递归函数的概念、定义与调用

10.结构体类型

【3】结构体的定义及应用

11.指针类型

【4】指针的概念及调用

【4】指针与数组

【4】字符指针与string类

【4】指向结构体的指针

12.文件及基本读写

【2】文件的基本概念,文本文件的基本操作

【2】文本文件类型与二进制文件类型

【2】文件重定向、文件读写等操作

13.STL模板应用

【3】<algorithm> 中sort函数

【4】栈(stack)、队列(queue)、链表(list)、向量(vector)等容器

2.1.3数据结构

1.线性表

【3】链表:单链表、双向链表、循环链表

【3】栈

【3】队列

2.简单树

【3】树的定义及其相关概念

【4】树的父亲表示法

【3】二叉树的定义及其基本性质

【4】二叉树的孩子表示法

【4】二叉树的遍历:前序、中序、后序遍历

3.特殊树

【4】完全二叉树的定义与基本性质

【4】完全二叉树的数组表示法

【4】哈夫曼树的定义、构造及其遍历

【4】二叉排序树的定义、构造及其遍历

4.简单图

【3】图的定义及其相关概念

【4】图的邻接矩阵存储

【4】图的邻接表存储

2.1.4算法

1.算法概念与描述

·【1】算法概念

·【2】算法描述:自然语言描述、流程图描述、伪代码描述

2.人门算法

【1】枚举法

【1】模拟法

3,基础算法

【3】贪心法

【3】递推法

【4】递归法

【4】二分法·

【4】倍增法

4.数值处理算法

【4】高精度的加法·

【4】高精度的减法·

【4】高精度的乘法

【4】求高精度整数除以单精度整数的商和余数

5.排序算法

【3】排序的基本概念(稳定性等)

【3】冒泡排序

【3】简单选择排序

【3】简单插入排序

6.图论算法

【4】图的深度优先遍历算法

【4】图的宽度优先遍历算法

【5】洪水填充算法(floodfill)

7.动态规划

【4】动态规划的基本思路

【4】简单一维动态规划

【5】简单背包类型动态规划

【5】简单区间类型动态规划

2.1.5数学

1.数及其运算

【1】数的概念,算术运算(加、减、乘、除、求余)

【1】数的进制:二进制、八进制、十六进制和十进制及其转换

【2】编码:ASCI码,哈夫曼编码,格雷码

2.初中数学

【1】初中代数

【1】初中平面几何

3.初等数论

【3】整除、因数、倍数、指数、质数、合数、同余等概念

【3】唯一分解定理

【3】欧几里德算法(辗转相除法)

【4】埃氏筛法和线性筛法求素数

4.组合数学

【2】加法原理

【2】乘法原理

【4】排列及计算公式

【4】组合及计算公式

【4】杨辉三角公式

本系列算法题目难度为普及组难度,包含了常用的模拟、二分、搜索、dp等算法。

各位oier可以用来赛前热身练习,不足的地方一定要及时复习强化哦。

1.俏佳⼈

Description

“我常常帮助⼀些翘家的⼈”⸺杰哥

杰哥是个⼼地善良的好⼈,他总是随⾝带着很多⾯包,遇到⽆家可归的⼈,就会请他们吃。这天,杰哥带了m块⾯包出⻔,先后遇到了n个翘家⼈。每个翘家⼈都有⼀个饥饿值ai,杰哥需要给他吃ai块⾯ 包他才会满⾜;如果⾝上的⾯包不够,杰哥就⼲脆不给他⾯包,⽽是直接带他去超商。请问杰哥最后还剩多少块⾯包?

Format Input

第⼀⾏输⼊两个整数n,m,表⽰翘家⼈数量和⾯包数量 第⼆⾏输⼊n个整数,表⽰每个翘家⼈的饥饿值1<=n<=100,1<=m<=1000,1<=ai<=10

Format Output

输出⼀个整数,表⽰杰哥剩余的⾯包数量

Sample Input

6 8

1 1 4 5 1 4

Sample Output

1

Restrictions

Time Limit: 1000 ms

Memory Limit: 65536 kb

/*
	 1.俏佳人
	 解题思路:模拟 	    
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,x,cnt;
int main()
{
	cin>>n>>m; 
	for(int i=1;i<=n;i++)
	{
		cin>>x; 
		if(m>=x)m-=x;//面包够 就发放 
	}
	cout<<m;
	return 0;
} 

2.看书

Description

“阿伟,你⼜在打电动哦,休息⼀下吧,去看个书好不好”⸺阿妈

阿伟决定认真看书,他已经计划好了未来n天每天要看⼀本书。这些书的内容都是连续的,因此阿伟必须按照顺序阅读,不然就会看不懂。但是暑假只剩下m天,所以聪明的阿伟打算,把连续⼏天要看的书,集中在⼀天看完。这样就可以赶在暑假之前,把所有的书都看完。

但是阿伟很弱,看太多书就会觉得⽆聊。已知每本书有⼀个⽆聊值,阿伟⼀天内读书的⽆聊值总和为boring。阿伟希望使m天内boring的最⼤值尽可能⼩,请你帮忙计算出boring的最⼤值最⼩是多少。

Format Input

第⼀⾏输⼊两个整数n和m,表⽰阿伟要读的书的数量,以及暑假剩余的天数 第⼆⾏按顺序输⼊每⼀本书的⽆聊值 ai

1<=m<=n<=100000,ai为整数且1<=ai<=10000

Format Output

输出⼀个整数,为m天内boring的最⼤值最⼩是多少

Sample Input

7 5

100 400 300 100 500 101 400

Sample Output

500

Restrictions

Time Limit: 1000 ms

Memory Limit: 65536 kb

/*

2.看书
	解题思路:二分答案
	题目直接算不好算,但是如果说给我们一个boring值是很容易通过贪心法验证是否可行的。 
	boring 在一个范围内(max(a[i])--sum(ai)) 而且有单调性  boring值越大需要的天数越少 越有可能是可行的
	所以直接二分答案即可解决 
	
*/ 
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,mid,l,r,a[N];
int check(int x){
	int temp=a[0],cnt=1;//cnt是总天数 
	for(int i=1;i<n;i++)
	{
	
		if(a[i]+temp<=x)
		{
			temp+=a[i];	
		}
		else
		{
			temp=a[i];
			cnt++;
		}
	} 
	return cnt<=m;
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		l=max(l,a[i]);
		r+=a[i];
	}
	while(l<r)
	{
		mid=(l+r)/2;
		if(check(mid))
		{
			r=mid;
		}
		else
		{
			l=mid+1;
		}

	}
	cout<<l;
	return 0;
}

3.房间

Description

“我⼀个⼈住,我的房⼦还蛮⼤的,欢迎你们来我家玩”⸺杰哥

从上往下看,杰哥的房⼦是⼀个n*m的矩形。现在给出杰哥房⼦的俯视图,⽤‘0’表⽰地

板,‘1’表⽰围墙。如果两块地板相邻,且其中⼀块地板在另⼀块地板的上下左右四个⽅向,则这两块地板视为相连。每个房间由若⼲相连的地板构成,并且⽤围墙隔开,房间的⾯积就是房间内地板的数量。请你计算杰哥家⼀共有多少个房间,每个房间的⾯积是多少?

Format Input

第⼀⾏输⼊两个整数n和m,表⽰杰哥房⼦的⻓和宽接下来输⼊⼀个n*m的01矩阵,表⽰杰哥家的俯视图1<=n,m<=100

Format Output

第⼀⾏输出⼀个整数,表⽰杰哥家房间的数量

第⼆⾏按照⾯积从⼩到⼤的顺序,输出每个房间的⾯积,不同房间⾯积中间⽤⼀个空格隔开

Sample Input

4 4

0101

1010

0100

1010

Sample Output

6

1 1 1 1 1 4

Restrictions

Time Limit: 1000 ms

Memory Limit: 65536 kb

//3.房间
/*
	解题思路:广搜 
			 从每一个没被标记的点向四周搜索 走到的点标记一下  
*/ 
#include<bits/stdc++.h>
using namespace std;
 
struct point
{
	int x,y;
};
int n,m,l,r,cnt,used[110][110],ans[10010];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
queue<point>q;
char c[110][110];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>c[i]+1;//从下标1开始存储 
	for(int i=1;i<=n;i++)//从每一个点开始广搜 
		for(int j=1;j<=m;j++)
		if(c[i][j]=='0'&&used[i][j]==0)
		{
			used[i][j]=++cnt;
			point start={i,j};
			q.push(start);
			int area=1; 
			while(!q.empty())
			{
				point u,v;
				u=q.front();//取出头结点 
				q.pop();
				for(int k=0;k<4;k++)
				{
					v.x=u.x+dx[k];
					v.y=u.y+dy[k];
					if(v.x<1 || v.x>n || v.y<1 || v.y>m)continue;//越界位置跳过 
					if(c[v.x][v.y]=='1'){ //墙的位置跳过 
						cout<<"跳过"<<endl; 
						continue;
					};//此处是围墙则跳过 
					if(used[v.x][v.y])continue;//去过的位置  跳过 
					used[v.x][v.y]=cnt;//标记搜索到的新位置属于哪个房间 
					q.push(v);//新位置入队 
					area++;
				}
			}
			ans[cnt]=area;	
		}
	

	cout <<cnt <<endl;
	sort(ans+1,ans+1+cnt);
	for(int i=1;i<=cnt;i++)cout <<ans[i]<<"";
	return 0;
}

4.好吃的 (改编)

Description

“如果要来的话,我等⼀下可以带你们去超商,买⼀些好吃的喔”⸺杰哥

热情好客的杰哥带阿伟他们到超市⾥买好吃的。超市⾥有很多种⻝品和饮料,⽐如泡⾯、⼩泡芙,还有酒等等,⼀共n种商品。杰哥带了m元,已知每种商品价格pi,美味程度wi,可购买的数量ai,将杰哥购买的商品美味程度之和记为total。请计算total的最大值。

Format Input

第⼀⾏输⼊两个整数n和m,表⽰商品种类数和杰哥带的钱数。

接下来n⾏,每⾏3个整数,分别表⽰每种商品的商品价格pi,美味程度wi,可购买的数量ai,

对于30%的数据,1<=n<=5,1<=m<=5,1<=wi<=10,1<=ai<=10

对于100%的数据,1<=n<=200,1<=m<=1000,1<=wi<=20,1<=pi<=20,1<=ai<=1000,0且所有商品的美味程度之和不超过10000000

Format Output

输出⼀个整数,表⽰total有多少种不同取值(因为杰哥很⼤⽅,所以⾄少会买⼀件商品,不考虑⼀件商品都不买的情况)

Sample Input

4 5

1 2 3

2 4 1

3 4 3

4 5 2

Sample Output

10

Restrictions

Time Limit: 1000 ms

Memory Limit: 65536 kb

//4.好吃的  
/*
	解题思路:dp
			 该问题属于背包问题中的多重背包模型。
			 直接转换成0/1背包来解决会超时,所以需要进行二进制优化,然后再用0/1背包模型来解决。 

*/
#include<bits/stdc++.h>
using namespace std;
struct Goods{
	int p;
	int w;
};
Goods goods[20010];
int n, n1, m, p[1010], w[1010], a[1010], dp[2010];
int main(){
	
	cin >> n >> m;
	for (int i = 1; i <= n; i++){	//将每种物品进行  二进制 优化 
		cin >> p[i] >> w[i] >> a[i];
		for(int j=1;j<=a[i];j*=2)
		{
			goods[n1++]={p[i]*j,w[i]*j};
			a[i]-=j;
		}
		if(a[i]>0)
		{
			goods[n1++]={p[i]*a[i],w[i]*a[i]};
		}
	}
	for(int i = 0; i < n1; i++){	//01背包模型 
		for(int j = m; j >= 1; j--){
			if(j >= goods[i].p)
				dp[j] = max(dp[j],dp[j-goods[i].p]+goods[i].w);
			
		}	
	}
	cout<<dp[m];
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值