C语言蓝桥杯比赛原题和解析
蓝桥杯:在计算机编程领域,是具有一定含金量的竞赛,用于选拔信息技术人才。
一般分为多个领域,其中包含了C/C#/C++/Java/Python等编程语言的测试题,多为算法的设计题。
下面,在搜题过程中,整理了一些比较有意思的原题,用于提高算法设计技巧。
注意:这里给出的答案不唯一,且为C/C++试题及解析!
题目:
第一题:煤球数目
有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
读懂出题者的意图和考察目标:
1、 能不能识破递推规律。显然,这是一个递推(数列)类型的问题。
2、 是否掌握递推法。基本递推法是:后一项是前面若干项的计算。
3、 是否掌握递推法的C语言的实现。程序=算法+数据。这个问题的算法,是一个简单的for循环。这个问题中的数据是整型,但是,有些问题的计算过程和计算结果是浮点型。所以,在这一点要特别小心。每次期末考试,很多人都因为这个原因而扣分。
4、 是否具有细节观察和理解能力。“一堆煤球”、“三角棱锥形”,“请填表示煤球总数目的数字”、“注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字”,等等,这些都需要考生具有很好的细节观察和理解能力。每次考试时,总是看到有些考生不按照规定答题。
5、 是否具有基本的高中数学功底。“有一堆煤球,堆成三角棱锥形”,这是一个立体的棱锥,题目还特意地在下面强调,“第二层3个(排列成三角形)”、“第三层6个(排列成三角形)”……。
源代码:
#include<stdio.h>
int main()
{
int a[] ={};
for(int i = ; i < ; i ++)
a[i] = a[i-] + i;
int ans = ;
for(int j = ; j < ; j ++)
ans += a[j];
printf("%d\n",ans);
return ;
}
第二题:生日蜡烛
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了236根蜡烛。请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
读懂出题者的意图和考察目标:
1、 这同样是一个递推问题。
2、 递推方法。有变化:有限制。
3、 递推的实现。所以代码实现就要反映出这个变化来。
4、 所以直接用枚举法。start, end分别表示他开始过生日的年龄和今年的年龄,然后计算之间吹蜡烛的总和,如果等于236就输出start, end.
源代码:
#include<stdio.h>
int main()
{
int start, end; //年龄的下限和上限
for (start = ; start < ; start++) //年龄的下限的取值范围
{
for (end = start; end < ; end++) //年龄上限的取值范围
{
int sum = ;
for(int i = start; i <= end; i++) //年龄下、上限的和
sum += i;
if( sum == )
{
printf("start: %d end: %d\n", start, end);
}
}
}
return ;
}
第三题:交换瓶子
有N个瓶子,编号 1 ~ N,放在架子上。
比如有5个瓶子:
2 1 3 5 4
要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
输入格式为两行:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。
输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。
例如,输入:
5
3 1 2 5 4
程序应该输出:
3
再例如,输入:
5
5 4 3 2 1
程序应该输出:
2
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>,不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
贪心法,从左向右如果当前第i个瓶子编号不是i就把编号为i的瓶子换过来。
因为这里的n规模为10000,如果在交换的时候去用for找编号为i的瓶子在哪儿时间复杂度为O(n^2)会超时。
所以这里要用两个数组,一个数组是记录第i个瓶子编号为多少,一个是记录编号为i的瓶子在哪儿。注意我们在交换的时候要把这两个数组都维护!
源代码:
#include <stdio.h>
#include <math.h>
int arr[];
int flag[];
int main()
{
int ans = ;
int n,i;
scanf("%d",&n);
for(i = ; i <= n ; i ++) scanf("%d",&arr[i]);
for(i = ; i <= n ; i ++ )flag[arr[i]] = i;
for(i = ; i <= n ; i ++)
{
if( i != arr[i] )
{
int x = arr[i];
arr[i] ^= arr[flag[i]] ^= arr[i] ^= arr[flag[i]];
flag[i] ^= flag[x] ^= flag[i] ^= flag[x];
ans ++;
}
}
printf("%d\n",ans);
return ;
}
小结:
1.在计算机编程中,数学是很重要的,数学用于算法的设计,要有很强的逻辑性,除了算法,其他的界面设计也要有一定的逻辑性(即不能反人类行为)。
2.在设计相关算法时,要充分理解题意,即条件桩和结果,如何优化算法等。
3.在学习编程的时候,编程语言(C/C#/C++/Java/Python)等它们之间是有相互联系的,主要是编程工具的开发环境,包和类,接口的部分区别,C语言是最基本的编程语言,即入门语言,新兴起的Python语言,是基于人工智能的编程语言,个人认为,Python语言是最简单易学的编程语言。因此,在编程语言的选择上,并不需要过度纠结它们的好坏,主要是了解核心算法,编程主要为算法设计,编程语言只是实现它的一种方式。
C语言蓝桥杯比赛原题和解析的更多相关文章
- 2018年第九届蓝桥杯B组题C++汇总解析-fishers
2018年第九届蓝桥杯B组题C++解析-fishers 题型 第一题:第几天 第二题:明码 第三题:乘积尾零 第四题:测试次数 第五题:快速排序 第六题:递增三元组 第七题:螺旋折线 第八题:日志统计 ...
- 啤酒和饮料|2014年蓝桥杯B组题解析第一题-fishers
啤酒和饮料|2014年第五届蓝桥杯B组题解析第一题-fishers 啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请 ...
- 蓝桥杯Java真题解析
上个月参加蓝桥杯省赛拿了个省一,自从比赛完之后就一直没怎么写代码了,还有一个多月就要国赛了,从现在开始准备下国赛,但是我也不想学什么算法,而且我还在准备考研,所以就打算只做下历年的真题,争取国赛拿个国 ...
- 黄金连分数|2013年蓝桥杯B组题解析第四题-fishers
黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜,它首次 ...
- 奇怪的分式|2014年蓝桥杯B组题解析第六题-fishers
奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念 ...
- 乘积最大|2018年蓝桥杯B组题解析第十题-fishers
标题:乘积最大 给定N个整数A1, A2, ... AN.请你从中选出K个数,使其乘积最大. 请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数. 注意,如果X ...
- 前缀判断|2013年蓝桥杯B组题解析第五题-fishers
前缀判断 如下的代码判断 needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL. 比如:"abcd1234" 就包含了 &quo ...
- 奇怪的比赛|2012年蓝桥杯B组题解析第四题-fishers
(8')奇怪的比赛 某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度.答对的,当前分数翻倍:答错了则扣掉与题号相同的分数(选手必须 ...
- 排它平方数|2013年蓝桥杯A组题解析第二题-fishers
排它平方数 小明正看着 203879 这个数字发呆. 原来,203879 * 203879 = 41566646641 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是 ...
随机推荐
- Hibernate-validator数据验证
前言 数据效验工作在开发工作中,是非常重要的,保证数据的正确性,可靠性,安全性.不仅在前端进行效验,还要在后台继续进行效验. 前端做验证只是为了用户体验,比如控制按钮的显示隐藏,单页应用的路由跳转等等 ...
- 14 IO流(十一)——装换流InputStreamReader与OutputStreamWriter
什么是转换流 首先,这里的转换流指的是InputstreamReader与OutputStreamWriter. 正如它们的名字,它的作用是将字节流转换为字符流. 为什么要转换为字符流呢?因为对于获取 ...
- configparser 文件加字典操作
import configparser conf=configparser.ConfigParser() #創建一個對象 # f=open('db.ini','w') conf['DEFAULT'] ...
- Feign 失败降级未生效和超时配置优先级问题
一.问题: 生产环境服务A 通过feign调用 服务B,服务A报警信息如下: 详细分析发现问题 (1)服务A调用服务B失败,未触发声明的失败降级操作 (2)同时配置ribbon和feign超时时间,优 ...
- unbuntu 16.04 MS-Celeb-1M + alexnet + pytorch
最近被保研的事情搞的头大,拖了半天才勉强算结束这个了.从熟悉unbantu 16.04的环境(搭个翻墙的梯子都搞了一上午 呸!)到搭建python,pytorch环境.然后花了一个上午熟悉py的基本语 ...
- CLASSPATH 环境变量设置
当 JVM 运行时,如果设置了 CLASSPATH 变量,那么 JVM 会到该目录下寻找 java 类文件 该变量配置的方式不同,寻找顺序也不同 在我的 D:\tmp\java\quickstart\ ...
- C语言中特殊字符含义
字符 中文 英文 说明 \n 换行符 newline \t Tab键 \b backspace 退格键
- Widget Size and Position !!!!!!!!!!!!!!!!!!
https://medium.com/@diegoveloper/flutter-widget-size-and-position-b0a9ffed9407 I have read many ques ...
- js实现frame框架部分页面的刷新
一.先来看一个简单的例子: 下面以三个页面分别命名为frame.html.top.html.bottom.html为例来具体说明如何做. frame.html 由上(top.html)下(bottom ...
- Linux (x86) Exploit 开发系列教程之三(Off-By-One 漏洞 (基于栈))
off by one(栈)? 将源字符串复制到目标缓冲区可能会导致off by one 1.源字符串长度等于目标缓冲区长度. 当源字符串长度等于目标缓冲区长度时,单个NULL字节将被复制到目标缓冲区上 ...