蓝桥杯真题

目录

第一题

第二题

第三题

第四题


 

刚开始这个系列,后面还会继续更新

第一题

描述
Pell数列a1,a2,a3,...的定义是这样的,a1=1,a2=2,...,an=2an−1+an−2(n > 2).
给出一个正整数k,要求Pell数列的第k项模上32767是多少。
格式
输入格式
第1行是测试数据的组数n(n不超过1000),后面跟着n行输入。每组测试数据占1行,包括一个正整数k (1≤k<1000000)。
输出格式
n行,每行输出对应一个输入。输出应是一个非负整数。
样例
输入样例
2
1
8
输出样例
1
408
限制
时间限制: 10000 ms
内存限制: 65536 KB
 注意点1:“第k项模上32767”,每次计算都要模32767
注意点2:每次开始循环,都得设a1=1,a2=2

剩下没啥好说的,很简单

#include 
#include 
#include 
#include 
using namespace std;
 
int main ()
{
	int n, a1=1, a2=2, a3, k=0;
	long long tmp, a[1005];
	scanf ("%d", &n);
	for (int i=0; i

第二题

问题:

X星系的机器人可以自动复制自己。它们用1年的时间可以复制出2个自己,然后就失去复制能力。每年X星系都会选出1个新出生的机器人发往太空。也就是说,如果X星系原有机器人5个,
1年后总数是:5 + 9 = 14
2年后总数是:5 + 9 + 17 = 31
如果已经探测经过n年后的机器人总数s,你能算出最初有多少机器人吗?
输入格式:

输入一行两个数字n和s,用空格分开,含义如上。n不大于100,s位数不超过50位。
输出格式:

要求输出一行,一个整数,表示最初有机器人多少个。
输入样例:

在这里给出一组输入。例如:
2 31
输出样例:

在这里给出相应的输出。例如:
5
分析:

(1)一开始我也想的是直接暴力,反正知道正的递推式是每次增加的机器人数量add[i] = 2 * add[i-1] - 1,那就把每次的初始机器人数设出来慢慢循环n年,看看与s值相不相等呗。
(2)这个思路没有错,但是题目还有一个坑就是超大数不知道怎么存储,50位的数也远远超过long long 能存的19位(十进制)。但是看了别人的竟然发现 double 可以存储下这么长的整数…刷新认知,一直以为double只是能存较长的浮点数,且能存整数位数和long long一样。没想到能存这么长

#include 
using namespace std;

typedef long long ll;

const int MAX = 200;

int main()
{
	int n;
	double s;
	cin >> n >> s;
	//cout << s << endl;	// 可以打印出来,发现真的存的下

	// 设 i 为最初有的机器人数量,从0开始循环
	for (int i = 1; ; i++)
	{
		double sum = i;
		double add = i;

		// 随着年岁增长
		for (int t = 1; t <= n; t++) {
			add = 2 * add - 1;
			sum += add;
		}

		if (sum == s) {
			cout << i << endl;
			return 0;
		}
	}
}

第三题

题目描述

小明家住在一条胡同里。胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的。
有一天小明突然发现了有趣的事情:
如果除去小明家不算,胡同里的其它门牌号加起来,刚好是100!
并且,小明家的门牌号刚好等于胡同里其它住户的个数!....还有,小明家并不靠边,左右都有邻居。
请你根据这些信息,推算小明家的门牌号是多少?

输出格式

请提交该整数,不要填写任何多余的内容或说明性文字。

最小的号码从0开始枚举,每次计算户号之和sum和住户总数cnt
题目条件为如果除去小明家不算,胡同里的其它门牌号加起来,刚好是100!
即sum-小明家门牌号=100
并且,小明家的门牌号刚好等于胡同里其它住户的个数!
即小明家门牌号=cnt-1;

即sum-(cnt-1)=100   ->sum-cnt=99
发现只有这一个条件推出来的ans很多,但很明显有些是不符合条件的。
有个条件还没用,小明家并不靠边,左右都有邻居。
即cnt-1需要大于i
答案:10
 

#include
using namespace std;
int main()
{
	int sum;//门牌号之和
	int cnt;//总户数 
for(int i=0;i<=100;i++)//设门牌号从i开始 
{
sum=0,cnt=0;
for(int j=i;j<=100;j++)	//枚举 
{
	cnt++;
	sum+=j;
	if(sum-cnt==99&&cnt-1>i)
	cout<

第四题

题目描述

某次无聊中, atm 发现了一个很老的程序。这个程序的功能类似于 Excel ,它对一个表格进行操作。
不妨设表格有 n 行,每行有 m 个格子。
每个格子的内容可以是一个正整数,也可以是一个公式。
公式包括三种:
1. SUM(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的和。
2. AVG(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的平均数。
3. STD(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的标准差。
标准差即为方差的平方根。
方差就是:每个数据与平均值的差的平方的平均值,用来衡量单个数据离开平均数的程度。
公式都不会出现嵌套。
如果这个格子内是一个数,则这个格子的值等于这个数,否则这个格子的值等于格子公式求值结果。
输入这个表格后,程序会输出每个格子的值。atm 觉得这个程序很好玩,他也想实现一下这个程序。

输入格式

第一行两个数 n, m 。
接下来 n 行输入一个表格。每行 m 个由空格隔开的字符串,分别表示对应格子的内容。
输入保证不会出现循环依赖的情况,即不会出现两个格子 a 和 b 使得 a 的值依赖 b 的值且 b 的值依赖 a 的值。 

输出格式

输出一个表格,共 n 行,每行 m 个保留两位小数的实数。(n,m<=50)
数据保证不会有格子的值超过 1e6 。

输入样例

3 2
1 SUM(2,1:3,1)
2 AVG(1,1:1,2)
SUM(1,1:2,1) STD(1,1:2,2)

输出样例 

1.00 5.00
2.00 3.00
3.00 1.48

代码

#include
#include
#include
#include
#include
using namespace std;
double res[100][100];
string str[100][100];
int flag[100][100];
double sum(int,int,int,int);
double avg(int,int,int,int);
double stdd(int,int,int,int);
double func(int i,int j){
	int x1,x2,y1,y2;//这么转换string型我也很恶心
	int pos=0;
	if(str[i][j][0]=='S'||str[i][j][0]=='A'){
		if(str[i][j][5]>='0'&&str[i][j][5]<='9'){
			x1=(str[i][j][4]-'0')*10+str[i][j][5]-'0';
			pos+=1; 
		}
		else{
			x1=str[i][j][4]-'0';
		}
		if(str[i][j][7+pos]>='0'&&str[i][j][7+pos]<='9'){
			y1=(str[i][j][6+pos]-'0')*10+str[i][j][7+pos]-'0';
			pos+=1;
		}
		else{
			y1=str[i][j][6+pos]-'0';
		}
		if(str[i][j][9+pos]>='0'&&str[i][j][9+pos]<='9'){
			x2=(str[i][j][8+pos]-'0')*10+str[i][j][9+pos]-'0';
			pos+=1;
		}
		else{
			x2=str[i][j][8+pos]-'0';
		}
		if(str[i][j][11+pos]>='0'&&str[i][j][11+pos]<='9'){
			y2=(str[i][j][10+pos]-'0')*10+str[i][j][11+pos]-'0';
			pos+=1; 
		}
		else{
			y2=str[i][j][10+pos]-'0';
		}
	}
	if(res[i][j]!=0||flag[i][j]) return res[i][j];
	else if(str[i][j][0]=='S'&&str[i][j][1]=='U'){
		res[i][j]=sum(x1,y1,x2,y2);
		flag[i][j]=1;
	}
	else if(str[i][j][0]=='S'&&str[i][j][1]=='T'){
		res[i][j]=stdd(x1,y1,x2,y2);
		flag[i][j]=1;
	}
	else if(str[i][j][0]=='A'){
		res[i][j]=avg(x1,y1,x2,y2);//!!!
		flag[i][j]=1;
	}
	return res[i][j];
}
int main(){
	int n,m;
	cin>>n>>m;
	getchar();
	memset(res,0,sizeof(res));
	memset(flag,0,sizeof(flag));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>str[i][j];
			if(str[i][j][0]>='0'&&str[i][j][0]<='9'){
				flag[i][j]=1;
				int tt=str[i][j].length()-1,t=1;
				while(tt>=0){
					res[i][j]+=(str[i][j][tt]-'0')*t;
					t*=10;
					tt--;
				}
			}
		}
	} 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(res[i][j]==0){
				res[i][j]=func(i,j);
			} 
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(j==m){
				printf("%.2lf",res[i][j]);
			}
			else{
				printf("%.2lf ",res[i][j]);
			}
		}
		printf("\n");
	}
	return 0;
} 
double avg(int x1,int y1,int x2,int y2){
	double summ=0,temp;
	int cnt=0;
	for(int i=x1;i<=x2;i++){
		for(int j=y1;j<=y2;j++){
			temp=func(i,j);
			summ+=temp;
			cnt++;
		}
	}
	return summ/(cnt*1.0);
}
double sum(int x1,int y1,int x2,int y2){
	double summ=0,temp;
	for(int i=x1;i<=x2;i++){
		for(int j=y1;j<=y2;j++){
			temp=func(i,j);
			summ+=temp;
		}
	}
	return summ;
}
double stdd(int x1,int y1,int x2,int y2){
	double summ=0,temp;
	int cnt=0;
	for(int i=x1;i<=x2;i++){
		for(int j=y1;j<=y2;j++){
			temp=func(i,j);
			summ+=temp;
			cnt++;
		}
	}
	double temp2=summ/cnt*(1.0);
	summ=0;
	for(int i=x1;i<=x2;i++){
		for(int j=y1;j<=y2;j++){
			temp=func(i,j);
			temp=abs(temp-temp2);
			temp*=temp;
			summ+=temp;
		}
	}
	return sqrt(summ/(cnt*1.0));
}

 

再见

这个系列后面还会再更新

你可能感兴趣的:(c++,蓝桥杯)