1、标题:武功秘籍

小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的)。他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。

小明只想练习该书的第81页到第92页的武功,又不想带着整本书。请问他至少要撕下多少张纸带走?

这是个整数,请通过浏览器提交该数字,不要填写任何多余的内容。

这题看起来有点摸不到头脑,实际上只要搞懂书的模型就可以了,10和11页在一张纸上,那么倒着推,就可以知道第一页是单独一张纸的,那么很容易就可以知道,81-92一共在7张纸上

7

2、标题:等额本金

小明从银行贷款3万元。约定分24个月,以等额本金方式还款。

这种还款方式就是把贷款额度等分到24个月。每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息。

假设月利率是:0.005,即:千分之五。那么,

第一个月,小明要还本金 1250, 还要还利息:30000 * 0.005,总计 1400.00
第二个月,本金仍然要还 1250, 但利息为:(30000-1250) * 0.005 总计 1393.75

请问:小明在第15个月,应该还款多少(本金和利息的总和)?

请把答案金额四舍五入后,保留两位小数。注意:32.5,一定要写为:32.50

通过浏览器提交答案,这是一个含有小数点和两位小数的浮点数字。不要写多余内容(例如:多写了“元”或添加说明文字)

很简单的模拟,注意以下数据类型就好,答案是1312.50

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int num=30000;
	for(int i=1;i<=24;i++)
	{
		cout<<i<<" "<<(num-1250*(i-1))*0.005+1250<<endl;
	}
	return 0;
}

3、标题:猜年龄

小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”

请你写出:小明的较小的妹妹的年龄。

注意: 只写一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。

暴力就可以了,答案是10

#include<bits/stdc++.h>
using namespace std;
int main()
{
	for(int i=1;;i++)
	{
		for(int j=i+1;j<=i+8;j++)
		{
			if((i+j)*6==i*j) 
			{
				cout<<i<<" "<<j<<endl;
				return 0;
			}
		}
	}
}

4、标题:大衍数列

中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。

它的前几项是:0、2、4、8、12、18、24、32、40、50 …

其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。

以下的代码打印出了大衍数列的前 100 项。

int main()
{
int i;
for(i=1; i<100; i++){
if(__________________) //填空
printf("%d “, ii/2);
else
printf("%d ", (i
i-1)/2);
}
printf(”\n");
}

请填写划线部分缺失的代码。通过浏览器提交答案。

注意:不要填写题面已有的内容,也不要填写任何说明、解释文字。

不要太简单系列,读题可以知道偶数项操作为项数平方除以二,可以得到答案

i%2==0

5、标题:锦标赛

如果要在n个数据中挑选出第一大和第二大的数据(要求输出数据所在位置和值),使用什么方法比较的次数最少?我们可以从体育锦标赛中受到启发。

如图【1.png】所示,8个选手的锦标赛,先两两捉对比拼,淘汰一半。优胜者再两两比拼…直到决出第一名。
蓝桥杯 2014 C++组本科 C/C++
第一名输出后,只要对黄色标示的位置重新比赛即可。

下面的代码实现了这个算法(假设数据中没有相同值)。

代码中需要用一个数组来表示图中的树(注意,这是个满二叉树,不足需要补齐)。它不是存储数据本身,而是存储了数据的下标。

第一个数据输出后,它所在的位置被标识为-1

//重新决出k号位置,v为已输出值
void pk(int* a, int* b, int n, int k, int v)
{
int k1 = k*2 + 1;
int k2 = k1 + 1;

if(k1>=n || k2>=n){
b[k] = -1;
return;
}

if(b[k1]==v)
pk(a,b,n,k1,v);
else
pk(a,b,n,k2,v);

//重新比较
if(b[k1]<0){
if(b[k2]>=0)
b[k] = b[k2];
else
b[k] = -1;
return;
}

if(b[k2]<0){
if(b[k1]>=0)
b[k] = b[k1];
else
b[k] = -1;
return;
}

if(______________________) //填空
b[k] = b[k1];
else
b[k] = b[k2];
}

//对a中数据,输出最大,次大元素位置和值
void f(int* a, int len)
{
int n = 1;
while(n<len) n *= 2;

int* b = (int*)malloc(sizeof(int*) * (2*n-1));
int i;
for(i=0; i<n; i++){
if(i<len)
b[n-1+i] = i;
else
b[n-1+i] = -1;
}

//从最后一个向前处理
for(i=2*n-1-1; i>0; i-=2){
if(b[i]<0){
if(b[i-1]>=0)
b[(i-1)/2] = b[i-1];
else
b[(i-1)/2] = -1;
}
else{
if(a[b[i]]>a[b[i-1]])
b[(i-1)/2] = b[i];
else
b[(i-1)/2] = b[i-1];
}
}

//输出树根
printf("%d : %d\n", b[0], a[b[0]]);

//值等于根元素的需要重新pk
pk(a,b,2*n-1,0,b[0]);

//再次输出树根
printf("%d : %d\n", b[0], a[b[0]]);

free(b);
}

int main()
{
int a[] = {54,55,18,16,122,17,30,9,58};
f(a,9);
}

请仔细分析流程,填写缺失的代码。

通过浏览器提交答案,只填写缺失的代码,不要填写已有代码或其它说明语句等。

要填空的位置应该是要比较元素的大小,根据大小再调顺序,连蒙带猜的得到答案

a[b[k1]]>a[b[k2]]

6、
标题:猜字母

把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。

接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。

得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。

答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。

一列连续正整数无限去除奇数位,最后留下来的肯定是2的N次方中最大的那个,口算就是1024位 ,1024除以19取余是17,17位的字母就是q

q

7、标题:扑克序列

A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。

请填写出所有符合要求的排列中,字典序最小的那个。

例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。

请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。

需要用到全排列函数,特别好用的一个函数,可以省很多时间
答案为2342A3A4

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s="223344AA";
	do{
		int a1=s.find("A",0);
		int a2=s.find("A",a1+1);
		int b21=s.find("2",0);
		int b22=s.find("2",b21+1);
		int c31=s.find("3",0);
		int c32=s.find("3",c31+1);
		int d41=s.find("4",0);
		int d42=s.find("4",d41+1);
		if(a2-a1==2&&b22-b21==3&&c32-c31==4&d42-d41==5) cout<<s<<endl;
	}while(next_permutation(s.begin(), s.end()));
	return 0;
}

8、标题:分糖果

有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

每个小朋友都把自己的糖果分一半给左手边的孩子。

一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。

反复进行这个游戏,直到所有小朋友的糖果数都相同为止。

你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。

【格式要求】

程序首先读入一个整数N(2<N<100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
要求程序输出一个整数,表示老师需要补发的糖果数。

例如:输入
3
2 2 4
程序应该输出:
4

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

比较简单的模拟,需要注意一下的是边界量,需要提前存一下

#include<stdio.h>
#include<iostream>
#include<memory.h>
using namespace std;
int num[105];
int N;
int check()
{
	for(int i=0;i<N-1;i++)
	{
		if(num[i]!=num[i+1])
			return 0;
	}
	return 1;
}
int main()
{
	int ans=0;
	cin>>N;
	for(int i=0;i<N;i++)
		cin>>num[i];
	while(!check())
	{
		int temp=num[0];
		num[0]/=2;
		for(int i=0;i<N-1;i++)
		{
			num[i]+=num[i+1]/2;
			num[i+1]/=2;
		}
		num[N-1]+=temp/2;
		for(int i=0;i<N;i++)
			if(num[i]%2==1) 
			{
				ans++;
				num[i]++;
			}
		
	}
	cout<<ans<<endl;
	return 0;
}

9、标题:斐波那契

斐波那契数列大家都非常熟悉。它的定义是:

f(x) = 1 … (x=1,2)
f(x) = f(x-1) + f(x-2) … (x>2)

对于给定的整数 n 和 m,我们希望求出:
f(1) + f(2) + … + f(n) 的值。但这个值可能非常大,所以我们把它对 f(m) 取模。
公式参见【图1.png】
蓝桥杯 2014 C++组本科 C/C++
但这个数字依然很大,所以需要再对 p 求模。

【数据格式】
输入为一行用空格分开的整数 n m p (0 < n, m, p < 10^18)
输出为1个整数

例如,如果输入:
2 3 5
程序应该输出:
0

再例如,输入:
15 11 29
程序应该输出:
25

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

这个题只对了40%,剩下的全部超时了,网上大神说需要用到矩阵快速幂,留下了学识不足的眼泪

40%代码

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
unsigned long long int num[10005];
unsigned long long int N,M,P,maxl;
unsigned long long int ans;
void init()
{
	ans=0;
	num[1]=1;
	num[2]=1;
	if(N==1)
	ans=1;
	else
	ans=2;
	for(unsigned long long int i=3;i<=N;i++)
	{
		num[i]=numQ[i-1]+num[i-2];
		ans+=num[i];
	}		
}
int main()
{
	cin>>N>>M>>P;
	init();
	ans=ans%(unsigned long long int)((1.0/pow(5,0.5))*(pow((1+pow(5,0.5))/2,M)-pow((1-pow(5,0.5))/2,M)));
	ans=ans%P;
	cout<<ans<<endl;
	return 0;
}

相关文章: