2015年第六届蓝桥杯省赛 C/C++真题混搭题解

小鱼鸡汤时刻:点墨(老爸)曰:养精蓄锐,厚积薄发。

                         墨点儿(我)曰:老爸说的对哈哈!

1.隔行变色

Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式。
小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,....
现在小明想知道,从第21行到第50行一共包含了多少个蓝色的行。

请你直接提交这个整数,千万不要填写任何多余的内容。

答案:15

 

2.立方尾不变(初步定范围)

有些数字的立方的末尾正好是该数字本身。
比如:1,4,5,6,9,24,25,....

请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。

请提交该整数,不要填写任何多余的内容。

答案:36
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int main() {
	int ans=0;
	for(ll i=1; i<=10000; i++) {
		ll tmp=i*i*i;
		if(tmp%10000==i||tmp%1000==i||tmp%100==i||tmp%10==i||tmp==i) {
			ans++;
			cout<<i<<endl;
		}
	}
	cout<<ans;
	return 0;
}
以下是zh同学的代码,觉得更条理清晰,赞一个!
#include<iostream>
using namespace std;
int main(){
	int sum=0;
	for(int i=1;i<=9;i++){
		if((i*i*i)%10==i)
		    sum++;
	}
	for(int i=10;i<=99;i++){
		if((i*i*i)%100==i)
		    sum++;
	}
	for(int i=100;i<=999;i++){
		if((i*i%1000*i)%1000==i)
		    sum++;
	}
	for(int i=1000;i<=9999;i++){
		if((i*i%10000*i)%10000==i) //为了避免超出数据范围,需要先mod 一下
		    sum++;
	}
	cout<<sum<<endl;
}

 

3.立方变自身

观察下面的现象,某个数字的立方,按位累加仍然等于自身
1^3 = 1 
8^3  = 512    5+1+2=8
17^3 = 4913   4+9+1+3=17
...

请你计算包括1,8,17在内,符合这个性质的正整数一共有多少个?

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

 

答案:6
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int main() {
	int ans=0;
	for(int i=1;i<10000;i++){
		ll tmp=i*i*i;
		int sum=0;
		while(tmp){
			sum+=tmp%10;
			tmp/=10;
		}
		if(sum==i){
			cout<<i<<' '<<i*i*i<<endl;
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

 

4.九数分三组(初步确定范围)

1~9的数字可以组成3个3位数,设为:A,B,C,  现在要求满足如下关系:
B = 2 * A
C = 3 * A

请你写出A的所有可能答案,数字间用空格分开,数字按升序排列。

注意:只提交A的值,严格按照格式要求输出。

答案:192 219 273 327
#include<iostream>
#include<cstring>
using namespace std;
int v[10];
bool judge(int a,int b,int c){
	memset(v,0,sizeof v);
	while(a){
		v[a%10]++;
		a/=10;
	}
	while(b){
		v[b%10]++;
		b/=10;
	}
	while(c){
		v[c%10]++;
		c/=10;
	}
	for(int i=1;i<=9;i++)
		if(v[i]!=1) return false;
	return true;
}
int main() {
	int ans=0;
	for(int i=111;i<=333;i++){
		if(judge(i,i*2,i*3)){
			cout<<i<<' '<<i*2<<' '<<i*3<<endl;
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

 

5.串逐位和(简单二分,注意含首不含尾)

给定一个由数字组成的字符串,我们希望得到它的各个数位的和。
比如:“368” 的诸位和是:17
这本来很容易,但为了充分发挥计算机多核的优势,小明设计了如下的方案:

int f(char s[], int begin, int end)
{
    int mid;
    if(end-begin==1) return s[begin] - '0';
    mid = (end+begin) / 2;
    return f(s,begin,mid)+f(s,mid,end);  //填空(包括头不包括尾)
}
    
int main()
{
    char s[] = "4725873285783245723";
    printf("%d\n",f(s,0,strlen(s)));
    return 0;
}

你能读懂他的思路吗? 请填写划线部分缺失的代码。

注意:只填写缺少的部分,不要填写已有代码或任何多余内容。

 

6.无穷分数(老朋友了)

无穷的分数,有时会趋向于固定的数字。
请计算【图1.jpg】所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0。

请填写该浮点数,不能填写任何多余的内容。

#include<cstdio>
#include<cmath>
using namespace std;
int main() {
	double sum=0;
	for(int i=100;i>=1;i--){
		sum=(1.0*i)/(i+sum);
		printf("%.5f\n",sum);
	}
        return 0;
}

 

 

7.奇妙的数字(解决方法同四题)

小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。
你能猜出这个数字是多少吗?

请填写该数字,不要填写任何多余的内容。

答案:69
#include<iostream>
#include<cstring>
using namespace std;
int v[10];
bool judge(int a,int b){
	memset(v,0,sizeof v);
	while(a){
		v[a%10]++;
		a/=10;
	}
	while(b){
		v[b%10]++;
		b/=10;
	}
	for(int i=0;i<=9;i++)
		if(v[i]!=1) return false;
	return true;
}
int main() {
	for(int i=40;i<=100;i++){
		if(judge(i*i,i*i*i))
			cout<<i<<' '<<i*i<<' '<<i*i*i<<endl;
	}
	return 0;
}

 

 

8.饮料换购(简单模拟)

乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。

请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。

输入:一个整数n,表示开始购买的饮料数量(0<n<10000)
输出:一个整数,表示实际得到的饮料数

例如:
用户输入:
100
程序应该输出:
149

用户输入:
101
程序应该输出:
151


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


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

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

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

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

#include<iostream>
#include<cmath>
using namespace std;
int main() {
	int n,sum,cur;
	cin>>n;
	sum=cur=n;
	while(cur>=3){
		sum+=cur/3;
		cur=cur/3+cur%3;
	}
	cout<<sum;
	return 0;
}

 

9.打印大X(纯找规律题)——极简主义  

小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。
为了便于比对空格,所有的空白位置都以句点符来代替。

要求输入两个整数m n,表示笔的宽度,X的高度。用空格分开(0<m<n, 3<n<1000, 保证n是奇数)
要求输出一个大X

例如,用户输入:
3 9
程序应该输出:
***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***

(如有对齐问题,参看【图1.jpg】)

再例如,用户输入:
4 21
程序应该输出
****................****
.****..............****.
..****............****..
...****..........****...
....****........****....
.....****......****.....
......****....****......
.......****..****.......
........********........
.........******.........
..........****..........
.........******.........
........********........
.......****..****.......
......****....****......
.....****......****.....
....****........****....
...****..........****...
..****............****..
.****..............****.
****................****

(如有对齐问题,参看【图2.jpg】)

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


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

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

 

以下为自己发现规律的手稿(字迹略潦草,还请各位小伙伴们凑合看)

#include<iostream>
#include<string>
using namespace std;
string str[1005];
int main() {
	int m,n,mid,len;
	cin>>m>>n;
	mid=n/2;
	len=mid*2+m;
	string s(len,'.');
	string ss(m,'*');
	for(int i=0;i<=mid;i++){
		str[i]=s;
		str[i].replace(i,m,ss);
		str[i].replace(len-m -i,m,ss);
	}
	for(int i=0;i<=mid;i++)
		cout<<str[i]<<endl;
	for(int i=mid-1;i>=0;i--)
		cout<<str[i]<<endl;
	return 0;
}

 

 

10.灾后重建

Pear市一共有N(<=50000)个居民点,居民点之间有M(<=200000)条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近,一次严重的地震毁坏了全部M条道路。
震后,Pear打算修复其中一些道路,修理第i条道路需要Pi的时间。不过,Pear并不打算让全部的点连通,而是选择一些标号特殊的点让他们连通。
Pear有Q(<=50000)次询问,每次询问,他会选择所有编号在[l,r]之间,并且 编号 mod K  = C 的点,修理一些路使得它们连通。由于所有道路的修理可以同时开工,所以完成修理的时间取决于花费时间最长的一条路,即涉及到的道路中Pi的最大值。

你能帮助Pear计算出每次询问时需要花费的最少时间么?这里询问是独立的,也就是上一个询问里的修理计划并没有付诸行动。

【输入格式】
第一行三个正整数N、M、Q,含义如题面所述。
接下来M行,每行三个正整数Xi、Yi、Pi,表示一条连接Xi和Yi的双向道路,修复需要Pi的时间。可能有自环,可能有重边。1<=Pi<=1000000。

接下来Q行,每行四个正整数Li、Ri、Ki、Ci,表示这次询问的点是[Li,Ri]区间中所有编号Mod Ki=Ci的点。保证参与询问的点至少有两个。

【输出格式】
输出Q行,每行一个正整数表示对应询问的答案。

【样例输入】
7 10 4
1 3 10
2 6 9
4 1 5
3 7 4
3 6 9
1 5 8
2 7 4
3 2 10
1 7 6
7 6 9
1 7 1 0
1 7 3 1
2 5 1 0
3 7 2 1

【样例输出】
9
6
8
8

【数据范围】
对于20%的数据,N,M,Q<=30
对于40%的数据,N,M,Q<=2000
对于100%的数据,N<=50000,M<=2*10^5,Q<=50000. Pi<=10^6. Li,Ri,Ki均在[1,N]范围内,Ci在[0,对应询问的Ki)范围内。

 


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


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

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

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

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

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值