2014年蓝桥杯(第5届)预赛本科B组C语言真题解析

2014年蓝桥杯(第5届)预赛本科B组C语言真题解析
2014年蓝桥杯(第5届)预赛本科B组C语言真题解析

2014年蓝桥杯(第5届)预赛本科B组真题解析

啤酒和饮料

啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。

我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。

注意:答案是一个整数。请通过浏览器提交答案。

不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。

(1)答案。

11

(2)编程思路。

把啤酒、饮料的单价和总共花的钱都乘上10,转换为整数。然后用循环对啤酒的罐数b(1≤b<823/23)和饮料的罐数c(1≤c<823/19)进行穷举,找出满足要求的啤酒罐数b。

(3)源程序。

#include

int main()

{

int b,c;

for (b=1;b<35;b++)

for (c=1;c<45;c++)

{

if((823==b*23+c*19) &&(b

printf("%d\n",b);

}

return 0;

}

(4)用单重循环完成穷举。

实际上,也可以只对啤酒的罐数进行穷举。

#include

int main()

{

int b,cSum;

for (b=1;b<35;b++)

{

cSum=823-23*b;

if (cSum%19==0 && cSum/19>b)

printf("%d\n",b);

}

return 0;

}

切面条

一根高筋拉面,中间切一刀,可以得到2根面条。

如果先对折1次,中间切一刀,可以得到3根面条。

如果连续对折2次,中间切一刀,可以得到5根面条。

那么,连续对折10次,中间切一刀,会得到多少面条呢?

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

(1)答案。

1025

(2)编程思路。

由题目可知,对折0次切一刀得到2根,对折1次切一刀得到3根,对折2次切一刀得到5根。自己再尝试对折3次切一刀,发现可以得到9根。

设F[i]表示对折i次后中间切一刀得到的面条根数,则有

F[i]=2*F[i-1]-1 (i≥1)。

(3)源程序。

#include

int main()

{

int f[11]={2,3,5};

for (int i=3;i<=10;i++)

{

f[i]=2*f[i-1]-1;

}

printf("%d\n",f[10]);

return 0;

}

李白打酒

话说大诗人李白,一生好饮。幸好他从不开车。

一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

无事街上走,提壶去打酒。

逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

(1)答案。

14

(2)编程思路。

采用递归的方法生成15位二进制数的排列,对每一种排列进行判断,看是否满足要求(遇到店5次、酒正好喝完、最后一次遇到的是花),满足条件输出对应字符串即可。

(3)源程序。

#include

int cnt=0;

void dfs(int *a,int k)

{

if (k==15)

{

int alcohol,drinkery,i;

alcohol=2; drinkery=0;

for (i=0;i<15;i++)

if (a[i]==0)

{

alcohol=2*alcohol;

drinkery++;

}

else

alcohol--;

if (alcohol==0 && drinkery==5 && a[14]==1)

{

for (i=0;i<15;i++)

if (a[i]==0) printf("a");

else printf("b");

printf("\n");

cnt++;

}

return;

}

a[k]=0;

dfs(a,k+1);

a[k]=1;

dfs(a,k+1);

}

int main()

{

int a[15];

dfs(a,0);

printf("Count=%d\n",cnt);

return 0;

}

(4)程序优化。

上面的程序中用二进制数0表示遇到店,1表示遇到花。实际上,可以直接定义一个字符数组char a[16],该数组的元素a[0]~a[14]直接用字符’a’或’b’赋值,a[15]赋结束符’\0’。

另外,通过递归产生15位二进制数的排列,共215=32768种情况,也就是上面的程序搜索判断了32768种情况。实际上,由于满足问题的解是遇店5次,因此在某一搜索过程中遇店达到6次,肯定不是问题的解,无需继续进行,可以实施剪枝。

为了实施剪枝,需要在递归时记录酒的斗数和遇店的次数,可以改写函数为

void dfs(char *a,int k,int alcohol,int drinkery),其中alcohol记录酒壶里酒的斗数,drinkery 记录遇店的次数。

剪枝优化后的源程序如下:

#include

int cnt=0;

void dfs(char *a,int k,int alcohol,int drinkery)

{

if (k==15)

{

if (alcohol==0 && drinkery==5 && a[14]=='b')

{

printf("%s\n",a);

cnt++;

}

return;

}

if (drinkery<=5 && alcohol!=0) // 剪枝

{

a[k]='a';

dfs(a,k+1,2*alcohol,drinkery+1);

a[k]='b';

dfs(a,k+1,alcohol-1,drinkery);

}

}

int main()

{

char a[16];

a[15]='\0';

dfs(a,0,2,0);

printf("Count=%d\n",cnt);

return 0;

}

史丰收速算

史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传

统手算!

速算的核心基础是:1位数乘以多位数的乘法。

其中,乘以7是最复杂的,就以它为例。

因为,1/7 是个循环小数:0.142857...,如果多位数超过142857...,就要进1同理,2/7, 3/7, ... 6/7 也都是类似的循环小数,多位数超过n/7,就要进n 下面的程序模拟了史丰收速算法中乘以7的运算过程。

乘以7 的个位规律是:偶数乘以2,奇数乘以2再加5,都只取个位。

乘以7 的进位规律是:

满142857 (1)

满285714 (2)

满428571 (3)

满571428 (4)

满714285 (5)

满857142... 进6

请分析程序流程,填写划线部分缺少的代码。

//计算个位

int ge_wei(int a)

{

if(a % 2 == 0)

return (a * 2) % 10;

else

return (a * 2 + 5) % 10;

}

//计算进位

int jin_wei(char* p)

{

char* level[] = {

"142857",

"285714",

"428571",

"571428",

"714285",

"857142"

};

char buf[7];

buf[6] = '\0';

strncpy(buf,p,6);

int i;

for(i=5; i>=0; i--){

int r = strcmp(level[i], buf);

if(r<0) return i+1;

while(r==0){

p += 6;

strncpy(buf,p,6);

r = strcmp(level[i], buf);

if(r<0) return i+1;

______________________________; //填空

}

}

return 0;

}

//多位数乘以7

void f(char* s)

{

int head = jin_wei(s);

if(head > 0) printf("%d", head);

char* p = s;

while(*p){

int a = (*p-'0');

int x = (ge_wei(a) + jin_wei(p+1)) % 10;

printf("%d",x);

p++;

}

printf("\n");

}

int main()

{

f("428571428571");

f("34553834937543");

return 0;

}

注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字)

(1)参考答案。

if(r>0) return i

(2)解析。

leve[i]就相当于满leve[i]进i+1,因为填空所在的那段是判断条件为r==0的循环,所以是在当前buff段与某个leve相等的情况下,看下一个buff段进位多少,那么r<0就是进位i+1,r>0就是进位i,r==0就继续看下一段buff。

打印图形

小明在X星球的城堡中发现了如下图形和文字:

小明开动脑筋,编写了如下的程序,实现该图形的打印。

#define N 70

void f(char a[][N], int rank, int row, int col)

{

if(rank==1){

a[row][col] = '*';

return;

}

int w = 1;

int i;

for(i=0; i

____________________________________________;

f(a, rank-1, row+w/2, col);

f(a, rank-1, row+w/2, col+w);

}

int main()

{

char a[N][N];

int i,j;

for(i=0;i

for(j=0;j

f(a,6,0,0);

for(i=0; i

for(j=0; j

printf("\n");

}

return 0;

}

请仔细分析程序逻辑,填写缺失代码部分。

通过浏览器提交答案。注意不要填写题目中已有的代码。也不要写任何多余内容(比如说明性的文字)

(1)参考答案。

f(a, rank-1, row, col+w/2);

奇怪的分式

上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:

1/4 乘以8/5

小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)

老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!

对于分子、分母都是1~9 中的一位数的情况,还有哪些算式可以这样计算呢?

请写出所有不同算式的个数(包括题中举例的)。

显然,交换分子分母后,例如:4/1 乘以5/8 是满足要求的,这算做不同的算式。

但对于分子分母相同的情况,2/2 乘以3/3 这样的类型太多了,不在计数之列!

注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。

(1)答案。

14

(2)编程思路。

将分式符号化为:a/b × c/d = (10a+c)/(10b+d)。对a、b、c、d在1~9之间取值穷举即可。穷举时,a!=b且c!=d。

(3)源程序。

#include

int main()

{

int cnt=0;

for(int a=1;a<=9;a++)

{

for(int b=1;b<=9;b++)

{

if(b==a) continue;

for(int c=1;c<=9;c++)

{

for(int d=1;d<=9;d++)

{

if(d==c) continue;

if(a*c*(b*10+d)==b*d*(a*10+c))

cnt++;

}

}

}

}

printf("%d\n",cnt);

return 0;

}

六角填数

如图【1.png】所示六角形中,填入1~12的数字。

使得每条直线上的数字之和都相同。

图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?

请通过浏览器提交答案,不要填写多余的内容。

(1)答案。

10

(2)编程思路。

定义一个数组int a[13],其中a[1]~a[12]这12个元素分别从上到下,自左向右的12个圆圈。可采用递归的方法生成由1~12这12个数字组成的无重复数字的全排列。

生成1~12不同的12个数字存储到数组中后,检测6条直线上的四个数字之和是否全相等,如果全相等,是一组解,输出并计数。

(3)源程序。

#include

int a[13];

int vis[13];

int cnt=0;

void dfs(int x)

{

if(x == 12)

{

int t[6];

t[0] = a[1] + a[3] + a[6] + a[8];

t[1] = a[1] + a[4] + a[7] + a[11];

t[2] = a[2] + a[3] + a[4] + a[5];

t[3] = a[2] + a[6] + a[9] + a[12];

t[4] = a[8] + a[9] + a[10] + a[11];

t[5] = a[12] + a[10] + a[7] + a[5];

for(int i = 1; i < 6; ++i)

{

if(t[i] != t[i-1]) return ;

}

cnt++;

printf("No %d\n",cnt);

printf("%12d\n",a[1]);

printf("%3d%6d%6d%6d\n",a[2],a[3],a[4],a[5]);

printf("%6d%12d\n",a[6],a[7]);

printf("%3d%6d%6d%6d\n",a[8],a[9],a[10],a[11]);

printf("%12d\n\n",a[12]);

return ;

}

for(int i = 1;i < 13; ++i)

{

if(!vis[i])

{

vis[i] = 1;

a[x] = i;

dfs(x+1);

vis[i] = 0;

}

}

}

int main()

{

for (int i=1;i<=12;i++)

vis[i]=0;

vis[1] = 1;

a[1] = 1;

vis[8] = 1;

a[2] = 8;

vis[3] = 1;

a[12] =3;

dfs(3);

printf("Count=%d\n",cnt);

return 0;

}

蚂蚁感冒

长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。

每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。

当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

【数据格式】

第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。

接着的一行是n个用空格分开的整数Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。

要求输出1个整数,表示最后感冒蚂蚁的数目。

例如,输入:

3

5 -2 8

程序应输出:

1

再例如,输入:

5

-10 8 -20 12 25

程序应输出:

3

(1)编程思路。

首先,两只蚂蚁相遇各自反向可以看作是两只蚂蚁分别穿过对方继续前进。这样处理的话就简单多了。感冒蚂蚁不管初始方向朝哪一边,它右边的蚂蚁只要向左走就可能碰撞感染(特殊情况除外),同样,它左边的蚂蚁只要朝右边走也可能被感染。

假如感冒蚂蚁开始时向左行,则会感染它左边所有向右行的蚂蚁(因为相遇后它穿过对方继续向左行碰到向右行的蚂蚁感染它们);相遇被感染的第1只蚂蚁也穿过继续向右行,感染所有它右边向左行的蚂蚁。

感冒蚂蚁开始时向右行情况类似。

这样,最后感冒的蚂蚁的数量为:

感冒蚂蚁左边蚂蚁向右走的数量+右边蚂蚁向左走的数量+感冒蚂蚁本身特殊情况是,当感冒蚂蚁向左爬的时候,如果感冒蚂蚁左边没有向右爬行的蚂蚁,那么不管感冒蚂蚁右边有多少向左爬行的,因爬行的速度相同感冒蚂蚁不会遇到向右爬的蚂蚁进

行感染,因此右边的蚂蚁也永远不可能被感染。

同样的,当感冒蚂蚁向右爬的时候,如果感冒蚂蚁右边没有向左爬行的蚂蚁,那么同样感冒蚂蚁左边的蚂蚁也永远不可能被感染。

(2)源程序。

#include

int abs(int x)

{

return x>=0?x:-x;

}

int main()

{

int ant[51];

int n,i;

scanf("%d",&n);

for (i=0;i

scanf("%d",&ant[i]);

int left=0,right=0;

for (i=1;i

{

if (ant[i]<0 && abs(ant[i])>abs(ant[0]))

left++; // 感冒蚂蚁右边且向左走的

if (ant[i]>0&&abs(ant[i])

right++; // 感冒蚂蚁左边且向右走的

}

if ((ant[0]<0 && right==0)|| (ant[0]>0 && left==0))

printf("1\n");

else

printf("%d\n",left+right+1);

return 0;

}

地宫取宝

X 国王有一个地宫宝库。是n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。

地宫的入口在左上角,出口在右下角。

小明被带到地宫的入口,国王要求他只能向右或向下行走。

走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。

当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。

请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。

【数据格式】

输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)

接下来有n 行数据,每行有m 个整数Ci (0<=Ci<=12)代表这个格子上的宝物的价值要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对1000000007 取模的结果。

例如,输入:

2 2 2

1 2

2 1

程序应该输出:

2

再例如,输入:

2 3 2

1 2 3

2 1 5

程序应该输出:

14

(1)编程思路。

采用记忆化搜索完成。

定义4维数组dp[51][51][15][15]。设dp[x][y][num][val]表示在坐标(x,y)时拿了num件宝贝并且宝贝中价值最大的为val,其中1≤x≤n,1≤y≤m,num的初值为0,表示还没有拿到宝贝,val的初值本来应该为-1,表示此时手上还没有宝物(因为从题目数据说明中可以看出宝贝的价值可以为0),为了让val初始值为0,可以将输入的宝贝的价值统一加1,这样宝贝的最小价值为1(不是0)。

定义二维数组int map[51][51]保存地宫各格子的宝贝价值。

采用倒推法列出状态转移方程,即把后面的情况种数不断的往前更新。

当map[x][y]>val时,

dp[x][y][num][val]=dp[x+1][y][num+1][map[x][y]]+dp[x][y+1][num+1][map[x][y]]

+dp[x+1][y][num][val]+dp[x][y+1][num][val];

当map[x][y]<=val时,

dp[x][y][num][val]=dp[x+1][y][num][val]+dp[x][y+1][num][val]。

在通过DFS搜索方式求数组dp的各元素值时,由于数组元素值dp[x][y][num][val]跟位置(x,y)、宝贝个数以及当前最大的宝贝价值有关,当重复遍历这个结点时,若dp[x][y][num][val]的值已经计算出来了,则直接应用无需重复递归计算。为此,定义数组dp 的全部元素的初始值为-1。若计算时需要用到dp[x][y][num][val],此时dp[x][y][num][val]!=-1,则无需重复调用,直接应用计算好的dp[x][y][num][val]元素值。之所以初值定义为-1,是考虑到若路径不存在的情况(此时方案数应为0)。

(2)源程序。

#include

#include

#define MOD 1000000007

long long dp[51][51][15][15];

int map[51][51];

int n,m,k;

void dfs(int x, int y, int num, int val)

{

if (dp[x][y][num][val] != -1)

return;

dp[x][y][num][val] = 0;

if (x == n && y == m && num == k)

{

dp[x][y][num][val] = 1;

return;

}

if (map[x][y] > val && num < k)

{

dfs(x, y, num + 1, map[x][y]);

dp[x][y][num][val] += dp[x][y][num + 1][map[x][y]];

dp[x][y][num][val] %= MOD;

}

if (x < n) // 向下走

{

dfs(x + 1, y, num, val);

dp[x][y][num][val] += dp[x + 1][y][num][val];

dp[x][y][num][val] %= MOD;

}

if (y < m) // 向右走

{

dfs(x, y + 1, num, val);

dp[x][y][num][val] += dp[x][y + 1][num][val];

dp[x][y][num][val] %= MOD;

}

}

int main()

{

scanf("%d%d%d",&n,&m,&k);

for (int i = 1; i <=n ; i++)

{

for (int j = 1; j <= m; j++)

{

scanf("%d",&map[i][j]);

map[i][j]++;

}

}

memset(dp, -1, sizeof(dp));

dfs(1, 1, 0, 0);

printf("%d\n",dp[1][1][0][0]);

return 0;

}

小朋友排队

n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。

每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。

如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。

请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。

如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。

【数据格式】

输入的第一行包含一个整数n,表示小朋友的个数。

第二行包含n 个整数H1 H2 …Hn,分别表示每个小朋友的身高。

输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。

例如,输入:

3

3 2 1

程序应该输出:

9

【样例说明】

首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友,再交换身高为2和1的小朋友,每个小朋友的不高兴程度都是3,总和为9。

【数据规模与约定】

对于10%的数据,1<=n<=10;

对于30%的数据,1<=n<=1000;

对于50%的数据,1<=n<=10000;

对于100%的数据,1<=n<=100000,0<=Hi<=1000000。

(1)编程思路。

本题的实质是求一组数据中逆序数对的个数。比如题目中的3,2,1,和3有关的逆序对为(3,2)和(3,1),和2有关的逆序对为(3,2)和(2,1),和1有关的逆序对为(3,1)和(2,1),为了完成排序,任何一个逆序对的两个元素都必须交换一次,于是可知,每个小朋友都完成了两次交换。

要求一个数组元素有关的逆序对个数,就是求它之前有几个大于它的元素(设为b1),之后有几个小于它的元素(设为b2),这样每个元素的交换次数为b1+b2。

根据数据规模与约定,若采用二重循环进行暴力搜索逆序对的个数,肯定会超时的。因此,采用树状数组来解决本题。

树状数组实际上是由两部分组成:数据数组(设为num)和统计数组(设为C)。

我们以数据数组num[3]={3,2,1}为例进行描述。树状数组的各元素初始值为0,但由于树状数组元素下标是从1开始的,因此将数据数组的每个元素值加1,然后作为树状数组的下标,将数值1存到相应的位置。

从左到右依次扫描数据数组。

1)读入3,此时读入的数据个数为1,树状数组C为:

C[1] C[2]C[3] C[4] C[5] C[6] C[7] C[8] ……

0 0 0 1 0 0 0 0

可以看到sum(C[1],C[4])=1,这是小于等于3的数字的个数,也就是说当输入第一个数3的时候没有比它小的数字存在。这时“输入数值个数-sum(C[1],C[4])=1-1=0”,也就是说大于3的数字的个数为0,保存起来,即b[0]=0。(在这里特别注意,根据树状数组sum(C[1],C[n])算出来的数值是某个数字n左边比它小的数字的个数。)

2)读入2,此时读入的数据个数为2,树状数组C为:

C[1] C[2]C[3] C[4] C[5] C[6] C[7] C[8] ……

0 0 1 1 0 0 0 0

可以看到sum(C[1],C[3])=1,仍然不存在比它小的数,而此时输入的数据个数为2,2-1=1,就是说,存在一个数在2之前并且大于2(这个数是第1个数3),保存b[1]=1。

3)读入1,此时读入的数据个数为3,树状数组C为:

C[1] C[2]C[3] C[4] C[5] C[6] C[7] C[8] ……

0 1 1 1 0 0 0 0

可以看到sum(C[1],C[2])=1,仍然不存在比它小的数,而此时输入的数据个数为3,3-1=2,就是说,存在两个数在1之前并且大于1(这两个数就是3和2),保存b[2]=2。

到此,求出了每个数据元素前面的较大的数的个数了。

类似地,从右到左依次扫描数据数组,求出每个数据元素后面的较小的数的个数。此时依次直接求sum(C[1],C[n]),得到每个元素后面的较小的数的个数,然后将得到的数值累加到相应的b[i]中。最终我们会得到b[0]=2,b[1]=2,b[2]=2,分别对应num[0]=3,num[1]=2,num[2]=1。

另外需要注意的是,如果输入数组中出现重复的数字怎么办?如果出现,可以简单地处理。具体方法是通过树状数组求得sum(1,a)和sum(1,a+1),其中输入的数字为a,前者算出的小于a的数的个数,后者算出的是小于等于a(小于a+1)的数的个数,两个相减就是等于a的个数。

采用树状数组求得每个小朋友被移动的次数后,需要计算其不高兴程度。若小朋友被移动n次,则其不高兴程度为1+2+3+…+n。为避免重复计算,实现构造好total数组,数组元素total[n]的值就是1+2+3+…+n。这样在计算不高兴程度总和时直接引用元素值即可。

(2)源程序。

#include

#include

#define MAX 1000010

#define N 100010

int C[MAX],b[MAX];

int num[N];

long long total[N],ans;

int lowbit(int x) // 取出x的最低位1所在位号

{

return x&(-x);

}

void add(int pos,int num,int *C)

{

while(pos

{

C[pos]+=num;

pos+=lowbit(pos);

}

}

int Sum(int pos,int *C)

{

int sum=0;

while(pos>0)

{

sum+=C[pos];

pos-=lowbit(pos);

}

return sum;

}

int main()

{

int i;

total[0]=0;

for (i=1;i

{

total[i]=total[i-1]+i;

}

memset(C,0,sizeof(C));

int n;

scanf("%d",&n);

for (i=0;i

{

scanf("%d",&num[i]);

add(num[i]+1,1,C);

b[i]=i-Sum(num[i],C);

b[i]=b[i]-(Sum(num[i]+1,C)-Sum(num[i],C)-1);

}

memset(C,0,sizeof(C));

for(i=n-1;i>=0;i--)

{

add(num[i]+1,1,C);

b[i]=b[i]+Sum(num[i],C);

}

ans=0;

for(i=0;i

{

ans+=total[b[i]];

}

printf("%I64d\n",ans);

return 0;

}

蓝桥杯c c 省赛试题及答案解析

2016蓝桥杯c-c++B组省赛试题及解析 第一题 煤球数目 有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

答案:171700 #include<> int main() { int a[101] ={0}; for(int i = 1 ; i < 101 ; i ++) a[i] = a[i-1] + i; int ans = 0; for(int j = 1 ; j < 101 ; j ++) ans += a[j]; printf("%d\n",ans); return 0; }

第二题 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。 现在算起来,他一共吹熄了236根蜡烛。 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 答案:26 #include<> int main()

{ int start,end; for(start = 1 ; start < 236 ; start ++) { for( end = start ; end < 236 ; end ++ ) { int sum = 0; for(int i = start; i <= end; i ++) sum += i; if( sum == 236) { printf("start : %d end : %d\n",start,end); } } }

2014年第五届蓝桥杯预赛题目及标准答案

第十题 标题:小朋友排队 n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。 如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。 请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。 如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。 【数据格式】 输入的第一行包含一个整数n,表示小朋友的个数。 第二行包含n 个整数H1 H2 …Hn,分别表示每个小朋友的身高。 输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。 例如,输入: 3 3 2 1 程序应该输出: 9 【样例说明】 首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友,再交换身高为2和1的小朋友,每个小朋友的不高兴程度都是3,总和为9。 【数据规模与约定】 对于10%的数据,1<=n<=10; 对于30%的数据,1<=n<=1000; 对于50%的数据,1<=n<=10000; 对于100%的数据,1<=n<=100000,0<=Hi<=1000000。 资源约定: 峰值内存消耗< 256M CPU消耗< 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。注意: 所有依赖的函数必须明确地在源文件中#include ,不能通过工程设置而省略常用头文件。 提交时,注意选择所期望的编译器类型。 10 #include #include #include #include using namespace std; struct People { int top; int step; }; struct Cmp { bool operator()(const People &m, const People &n)const {

2014年第五届蓝桥杯预赛题目JAVA软件开发高职高专组

2014年预赛Java高职高专组 考生须知: ●考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压。 ●考试时间为4小时。时间截止后,选手无法继续提交答案。 ●在考试强制结束前,选手可以主动结束考试(需要身份验证),结束考试后将无法继续提交或浏览答案。 ●选手可浏览自己已经提交的答案。被浏览的答案允许拷贝。 ●对同一题目,选手可多次提交答案,以最后一次提交的答案为准。 ●参赛选手切勿在提交的代码中书写“姓名”、“考号”,“院校名”等与身份有关的信息或其它与竞赛题目无关的内容,否则成绩无效。 ●参赛选手必须通过浏览器方式提交自己的答案。选手在其它位置的作答或其它方式提交的答案无效。 ●试题包含三种类型:“结果填空”、“代码填空”与“程序设计”。 结果填空题:要求参赛选手根据题目描述直接填写结果。求解方式不限。不要求源代码。把结果填空的答案直接通过网页提交即可,不要书写多余的内容,比如:注释说明。 代码填空题:要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。所填写的代码不超过一条语句(即中间不能出现分号)。 把代码填空的答案(仅填空处的答案,不包括题面已存在的代码)直接通过网页提交即可,不要书写多余的内容,比如:注释或说明文字。 程序设计题目:要求选手设计的程序对于给定的输入能给出正确的输出结果。考生的程序只有能运行出正确结果,才有机会得分。 注意:在评卷时使用的输入数据与试卷中给出的示例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。 所有源码必须在同一文件中。调试通过后,拷贝提交。 注意:不要使用package语句。源程序中只能出现JDK1.6中允许的语法或调用。不能使用1.7或更高版本的特性。 注意:选手代码的主类名必须为:Main,否则会被判为无效代码。 1.结果填空(满分2分) 问题的描述在考生文件夹下对应题号的“题目.txt”中。相关的参考文件在同一目录中。请仔细阅读题目,不限解决问题的方式,只要求提交结果。 必须通过浏览器提交答案。 只提交题目要求的内容,不要填写任何多余的文字!! 2.结果填空(满分4分) 问题的描述在考生文件夹下对应题号的“题目.txt”中。相关的参考文件在同一目录中。请先阅读题目,不限解决问题的方式,只要求提交结果。 必须通过浏览器提交答案。

2012.C语言‘蓝桥杯“预赛.真题.高职

2011年选拔赛c 高职 考生须知: 考试时间为4小时。 本试卷包含两种题型:“代码填空”与“程序设计”。总计100分。 其中代码填空:3+3+3+5+7+9+12 = 42 分 程序设计:14+17+27 = 58分 填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。所填写的代码不超过一条语句(即不能出现分号)。 把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。 编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。考生的程序只有能运行出正确结果的时候才有机会得分。注意:在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。 对每个题目,要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。 对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。 1.代码填空(满分3分) 利息计算 小李年初在银行存款1千元(一年定期)。他计划每年年底取出100元救助失学儿童。假设银行的存款利率不变,年利率为3%,年底利息自动计入本金。下面的代码计算5年后,该账户上有多少存款。试填写缺失的代码。 把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。 double money = 1000; int n = 5; int i; for(i=0; i

蓝桥杯第一届初赛题目

第一届蓝桥杯预赛试题 c 本科 第一题,以下函数的功能是将任意整数进行因式分解, 请完成该程序的空缺使函数能够正常运算 void f(int n) { for(int i=2; i1) printf(“%d\n”, n); } 第二题,以下函数的功能是将给定字符串进行倒序输出,请完成该函数空缺部分。 char* p = “abcdef”; char* q = (char*)malloc(strlen(p)+1); for(int i=0, int len=strlen(p); i

q__1__ = p[i+1]; q[len-1] = p[0]; —–(2)—-; prin tf(“%s\n”, q); 第三题, int f(int m, int n) { int a = 1; int m1 = m; //—–(3)—- a *= m1–; int b = 1; while(n>1) b *= n–; return a / b; } 第四题,任意给出一个四位数, 把它重新组成一个四位的最大数和一个最小数, 算出两者间的差。 例如:3721这个数,可以重组成:7321和1237,相数之差为7321-1237 请完善下面这个函数,以实现此功能 int f(int n) { int N[4];

for(int i=0; i<4; i++) { N[3-i] = n % 10; —-(4)—- } for(i=0; i<3; i++) for(int j=0; j<3-i; j++) if(N[j]>N[j+1]) { int t = N[j+1]; N[j+1] = N[j]; N[j] = t; } int n_min=0; for(i=0; i<4; i++) n_min = n_min * 10 + N[i] ; int n_max = 0; for(i=3; i>=0; i–) n_max = n_max * 10 + N[i]; return n_max-n_min; } 第五题,假设有m+n个人,其中, m个人手持面额为5角的硬币, n个人手持面额为1元的硬币,

第三届蓝桥杯预赛真题及详细答案

第三届蓝桥桥杯预赛真题及详细答案 一、微生物增殖 假设有两种微生物X 和Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。 现在已知有新出生的X=10, Y=89,求60分钟后Y的数目。 如果X=10,Y=90 呢? 本题的要求就是写出这两种初始条件下,60分钟后Y的数目。 题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只Y 就是最终导致Y 种群灭绝的最后一根稻草! 请忍住悲伤,把答案写在“解答.txt”中,不要写在这里! 答案:0 和94371840 (此题比较简单就不写程序了,以下均有程序) 二、古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!” 华生:“我猜也是!” 于是,两人沉默了好久,还是没有算出合适的结果来。 请你利用计算机的优势,找到破解的答案。 把ABCDE 所代表的数字写出来。 答案写在“解答.txt”中,不要写在这里! 参考答案:21978 参考程序: #include void main(){ int k,t1 ,t; for(k=10234;k<50000;k++){ bool flag[10]={0}; t=k; t1=0; while(t){ if(flag[t%10]) break ; flag[t%10] = true ; t1 = t1*10 + t%10 ; t /= 10 ; } if( t==0 && t1%k==0){ printf("%d * %d = %d\n",k,t1/k,t1); } }

2018蓝桥杯试题

2018蓝桥杯C语言b组国赛真题 1.标题:换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种。 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。 小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍, 剩下的当然都是5元面额的。 银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗? (5元,2元,1元面额的必须都有,不能是0) 注意,需要提交的是一个整数,不要填写任何多余的内容。 手算都可以。。。下面是代码,答案74 1.#include https://www.360docs.net/doc/8c17367723.html,ing namespace std; 3.int main(){ 4.for(int i=1;i<40;i++){ 5.for(int j=1;j<200;j++){ 6.if(5*i+2*10*j+1*j==200) 7. cout<<"5*"<

12.2.标题:激光样式 x星球的盛大节日为增加气氛,用30台机光器一字排开,向太空中打出光柱。 安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开! 国王很想知道,在目前这种bug存在的情况下,一共能打出多少种激光效果? 显然,如果只有3台机器,一共可以成5种样式,即: 全都关上(sorry, 此时无声胜有声,这也算一种) 开一台,共3种 开两台,只1种 30台就不好算了,国王只好请你帮忙了。 要求提交一个整数,表示30台激光器能形成的样式种数。 注意,只提交一个整数,不要填写任何多余的内容。 思路很简单,暴力搜索,30个灯光从左到右,从左边第一个开始,第一个可以开关,第二个要根据左边的灯光是否开启来取值,以此类推。。。答案2178309 1.#include 2.#include https://www.360docs.net/doc/8c17367723.html,ing namespace std; 4.int ans = 0; 5.int x[31];//0代表关,1代表开 6. 7.void dfs(int index){ 8.if(index == 30){ 9.ans++; 10.return; 11.} 12.if(index == 0 || x[index-1] == 0){ //第一个灯光可以取0或1,当前灯 光左边要是没开,那当前灯光可以取0和1 13.for(int i=0;i<=1;i++){ 14.x[index] = i;

蓝桥杯C语言本科B组预赛试题

蓝桥杯C语言本科B组预赛试题

————————————————————————————————作者:————————————————————————————————日期:

2014蓝桥杯C/C++语言本科B组预赛试题(完整) 1.啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。 注意:答案是一个整数。请通过浏览器提交答案。 不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。 2.切面条 一根高筋拉面,中间切一刀,可以得到2根面条。 如果先对折1次,中间切一刀,可以得到3根面条。 如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀,会得到多少面条呢? 答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。 3.李白打酒

话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。 注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。 4.史丰收速算 史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算! 速算的核心基础是:1位数乘以多位数的乘法。 其中,乘以7是最复杂的,就以它为例。 因为,1/7是个循环小数:0.142857...,如果多位数超过142857...,就要进1 同理,2/7,3/7, ...6/7 也都是类似的循环小数,多位数超过n/7,就要进n

蓝桥杯试题C语言答案

1、A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些 人参加了竞赛: (1)A参加时,B也参加; (2)B和C只有一个人参加; (3)C和D或者都参加,或者都不参加; (4)D和E中至少有一个人参加; (5)如果E参加,那么A和D也都参加。 00110 c、d #include<> int main() { int a,b,c,d,e; /*0表示不参加, 1表示参加.*/ for(a=0;a<2;a++) for(b=0;b<2;b++) for(c=0;c<2;c++) for(d=0;d<2;d++) for(e=0;e<2;e++) { if(a&&!b) continue; if(b&&c||!b&&!c) continue; if(c&&!d||!c&&d) continue; if(!d&&!e) continue; if(e&&(!a||!d)) continue; printf("%d%d%d%d%d",a,b,c,d,e); } return 0; } 2、某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件: 1)A和B两人中至少去一人; 2)A和D不能一起去; 3)A、E和F三人中要派两人去; 4)B和C都去或都不去; 5)C和D两人中去一个; 6)若D不去,则E也不去。 试编写一个程序,输出问应当让哪几个人去? #include<> int main() { int a,b,c,d,e,f; for(a=1;a>=0;a--) for(b=1;b>=0;b--)/*1:去 0:不去*/ for(c=1;c>=0;c--)

第三届蓝桥杯(高职java预赛题及参考答案)

1、造成高房价的原因有许多,比如土地出让价格。既然地价高,土地的面积必须仔细计算。遗憾的是,有些地块的形状不规则,比如是如图【1.jpg】中所示的五边形。 一般需要把它划分为多个三角形来计算。 已知三边求三角形的面积需要用海伦定理,参见【2.jpg】 各条边长数据如下: AB = 52.1 BC = 57.2 CD = 43.5 DE = 51.9 EA = 33.4 EB = 68.2 EC = 71.9 根据这些数据求五边形地块的面积。四舍五入到小数后两位。只写结果,不要源代码! 1.jpg 2.jpg public class Onea { public static void main(String args[]) { double s_ABE = (52.1 + 68.2 + 33.4) / 2; double s_BEC = (68.2 + 57.2 + 71.9) / 2; double s_EDC = (71.9 + 51.9 + 43.5) / 2; // sqrt()是Math中的静态方法可以用类名直接调用 double A_ABE = Math.sqrt(s_ABE * (s_ABE - 52.1) * (s_ABE - 33.4) * (s_ABE - 68.2)); double A_BEC = Math.sqrt(s_BEC * (s_BEC - 68.2) * (s_BEC - 57.2) * (s_BEC - 71.9)); double A_EDC = Math.sqrt(s_EDC * (s_EDC - 71.9) * (s_EDC - 43.5) * (s_EDC - 51.9)); System.out.println(A_ABE + A_BEC + A_EDC); } }// 输出的结果是3789.8640994485186 public class One { public static void main(String[] args) { double AB = 52.1, BC = 57.2, CD = 43.5, DE = 51.9, EA = 33.4, EB = 68.2, EC = 71.9; System.out.println(mainji(AB,EB,EA) + mainji(EB,BC,EC) +

第三届蓝桥杯全国软件大赛java本科组预赛答案完整版

第三届蓝桥杯软件大赛java本科组预赛完整答案(完整) 本答案仅供参考,如有不同意见属正常。希望本文对您的学习有帮助!谢谢参阅! 结果填空题 1. public class first { private static double result; public static void main(String[] args) { int i[] = new int[100]; i[0] = 1; i[1] = 3; String string2 = ""; for(int j = 2;j < 30;j++) { i[j] = i[j-1] + i[j-2]; result = (double)i[j-1]/i[j]; string2 = new Double(result).toString(); System.out.print(i[j-1]+"/"+i[j]+" "); System.out.println(string2); } } } 2. public class two { public static void main(String[] args) { // TODO Auto-generated method stub int a,b,c; int d = 20; b = 1; c = 1; double sum = 0; while(d>4) {

for(a = 1;a <= d;a++) { b = a+1; while(b

蓝桥杯算法训练习题与官方答案

算法训练 编号:ALGO-1 题目:区间k大数查询列 关键字:排序查找 类型:普通试题 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式 第一行包含一个数n,表示序列长度。 第二行包含n个正整数,表示给定的序列。 第三个包含一个正整数m,表示询问个数。 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。 输出格式 总共输出m行,每行一个数,表示询问的答案。 样例输入 5 1 2 3 4 5 2 1 5 2 2 3 2 样例输出 4 2 数据规模与约定 对于30%的数据,n,m<=100; 对于100%的数据,n,m<=1000; 保证k<=(r-l+1),序列中的数<=1000000。 本题的Java参考代码如下: import java.io.BufferedInputStream; import java.io.IOException; import java.util.Arrays;

public class Main { private static BufferedInputStream in = new BufferedInputStream(System.in); public static void main(String[] args) throws IOException { int[] nums = new int[readInt()]; for(int i=0; i0; i--) { int a = readInt(); int b = readInt(); int c = readInt(); int[] tn = new int[b-a+1]; for(int j=0; j57); for(;(i&56) == 48 || (i&62) == 56; i=in.read()) sum = sum*10 + (i&15); return sum; } }

蓝桥杯试题

第四届“蓝桥杯”(C语言A组预赛) 1、 题目标题: 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日。 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。 高斯获得博士学位的那天日记上标着:8113 请你算出高斯获得博士学位的年月日。 2、 题目标题: 排它平方数 小明正看着203879 这个数字发呆。 原来,203879 * 203879 = 41566646641 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。 具有这样特点的6位数还有一个,请你找出它! 再归纳一下筛选要求: 1. 6位正整数 2. 每个数位上的数字不同 3. 其平方数的每个数位不含原数字的任何组成数位 答案是一个6位的正整数。 3、 标题: 振兴中华 小明参加了学校的趣味运动会,其中的一个项目是:跳格子。 地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg) 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。 要求跳过的路线刚好构成“从我做起振兴中华”这句话。 请你帮助小明算一算他一共有多少种可能的跳跃路线呢? 4、

蓝桥杯cc省赛试题及答案解析

2016蓝桥杯c-c++B组省赛试题及解析第一题 煤球数目 有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 答案:171700 #include int main() { int a[101] ={0}; for(int i = 1 ; i < 101 ; i ++) a[i] = a[i-1] + i; int ans = 0; for(int j = 1 ; j < 101 ; j ++) ans += a[j]; printf("%d\n",ans);

return 0; } 第二题 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了236根蜡烛。 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 答案:26 #include int main() { int start,end; for(start = 1 ; start < 236 ; start ++) { for( end = start ; end < 236 ; end ++ ) { int sum = 0; for(int i = start; i <= end; i ++) sum += i; if( sum == 236) { printf("start : %d end : %d\n",start,end);

第三届蓝桥杯预赛真题

专科预赛 1.土地测量 造成高房价的原因有许多,比如土地出让价格。既然地价高,土地的面积必须仔细计算。遗憾的是,有些地块的形状不规则,比如是如图【1.jpg】中所示的五边形。 一般需要把它划分为多个三角形来计算。 已知三边求三角形的面积需要用海伦定理,参见【2.jpg】 各条边长数据如下: AB = 52.1 BC = 57.2 CD = 43.5 DE = 51.9 EA = 33.4 EB = 68.2 EC = 71.9 根据这些数据求五边形地块的面积。四舍五入到小数后两位。只写结果,不要源代码! 答案写在“解答.txt”中,不要写在这里! 【1.jpg】

【2.jpg】 2.猜生日 今年的植树节(2012年3月12日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!” “把我出生的年月日连起来拼成一个8位数(月、日不足两位前补0)正好可以被今天的年、月、日整除!” 他想了想,又补充到:“再给个提示,我是6月出生的。” 根据这些信息,请你帮小明算一下,他叔叔的出生年月日。 答案写在“解答.txt”中,不要写在这里! 格式是年月日连成的8位数。 例如,如果是1948年6月12日,就写:19480612 3.放麦子 你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,在第4个棋盘格放8粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有64格)。 国王以为他只是想要一袋麦子而已,哈哈大笑。 当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用! 请你借助计算机准确地计算,到底需要多少粒麦子。

蓝桥杯试题标准答案(练习)

1、亲密数:假设有a、b两个数,若a的所有因子之和等于b,b的所有因子之和等于a,并且a不等于b,则称a和b是一对亲密数。如284和220就是一对亲密数。 #include int main() { int a,b,i,n; for(a=1;a<=10000;a++) { for(b=0,i=1;i<=a/2;i++) if(a%i==0) b+=i; for(n=0,i=1;i<=b/2;i++) if(b%i==0) n+=i; if(n==a&&a!=b&&a

int main() { long days = 5; /*1999年的最后一天为周5,把下一年加上5天对7取余为0的,则是周日*/ int i = 2000; for(;;) /*无循环终止条件,可以利用break语句终止循环*/ { if(i%4==0&&i%100!=0||i%400==0) { days = days%7+366; } else { days = days%7+365; } if(days%7==0&&i%100==99) { printf("%d",i); break; } i++; } return 0; } 3、马虎的算式:小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

2013蓝桥杯初赛c语言专科组--题目与答案资料

1. 题目标题: 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说: “我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请你推算一下,他当时到底有多年轻。 通过浏览器,直接提交他那时的年龄数字。 注意:不要提交解答过程,或其它的说明文字。 答案:18 2. 标题: 马虎的算式 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案竟然是对的!! 因为36 * 495 = 396 * 45 = 17820 类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54 假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0) 能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢? 请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。 满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。 答案直接通过浏览器提交。

注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。 答案:142 3. 标题: 振兴中华 小明参加了学校的趣味运动会,其中的一个项目是:跳格子。 地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg) 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。 要求跳过的路线刚好构成“从我做起振兴中华”这句话。 请你帮助小明算一算他一共有多少种可能的跳跃路线呢? 答案是一个整数,请通过浏览器直接提交该数字。 答案:35 4. 标题: 幻方填空 幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。 欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。 他把1,2,3,...16这16个数字填写在4 x 4的方格中。 如图p1.jpg所示,即: 16 ? ? 13 ? ? 11 ? 9 ? ? * ? 15 ? 1 表中有些数字已经显露出来,还有些用?和*代替。 请你计算出? 和 * 所代表的数字。并把 *所代表的数字作为本题答案提交。

第五届蓝桥杯C语言高职试题(填空)带答案

第一题 标题:武功秘籍 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的)。他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。 小明只想练习该书的第81页到第92页的武功,又不想带着整本书。请问他至少要撕下多少张纸带走? 这是个整数,请通过浏览器提交该数字,不要填写任何多余的内容。 第二题 标题:等额本金 小明从银行贷款3万元。约定分24个月,以等额本金方式还款。 这种还款方式就是把贷款额度等分到24个月。每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息。 假设月利率是:0.005,即:千分之五。那么, 第一个月,小明要还本金1250, 还要还利息:30000 * 0.005,总计1400.00 第二个月,本金仍然要还1250, 但利息为:(30000-1250) * 0.005 总计1393.75 请问:小明在第15个月,应该还款多少(本金和利息的总和)? 请把答案金额四舍五入后,保留两位小数。注意:32.5,一定要写为:32.50 通过浏览器提交答案,这是一个含有小数点和两位小数的浮点数字。不要写多余内容(例如:多写了“元”或添加说明文字) 第三题 标题:猜字母 把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。 接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。 得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。

答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。 第四题 标题:大衍数列 中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。它的前几项是:0、2、4、8、12、18、24、32、40、50 ... 其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。 以下的代码打印出了大衍数列的前100 项。 int main() { inti; for(i=1; i<100; i++){ if(__________________) //填空 printf("%d ", i*i/2); else printf("%d ", (i*i-1)/2); } printf("\n"); } 请填写划线部分缺失的代码。通过浏览器提交答案。 注意:不要填写题面已有的内容,也不要填写任何说明、解释文字。 第五题 标题:打印图形 小明在X星球的城堡中发现了如下图形和文字: rank=3

第七届蓝桥杯程序设计大赛题目及答案

第七届省赛 1.网友年龄 某君新认识一网友。 当问及年龄时,他的网友说: “我的年龄是个2位数,我比儿子大27岁, 如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄” 请你计算:网友的年龄一共有多少种可能情况? 提示:30岁就是其中一种可能哦. 请填写表示可能情况的种数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 7 x-y=3 2.生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了236根蜡烛。 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 26 #include using namespace std; int main(){ int i,j; int sum=0; for(i=1;i<=100;i++){ //年龄 sum=0; for(j=i;j<=100;j++){ //蜡烛数 sum=sum+j; if(sum==236){ cout<

3.方格填数 如下的10个格子 填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 //用dfs求 #include #include #include using namespace std; const int maxn=4; int mp[maxn][maxn]; int flag[10]; int ans=0; int init() { memset(mp,-10, sizeof mp); memset(flag,0, sizeof flag); } int fx[4]= {0,-1,-1,-1},fy[4]= {-1,-1,0,1}; int check(int i,int j) { for(int f=0; f<4; f++) { if(abs(mp[i][j]-mp[i+fx[f]][j+fy[f]])!=1||i+fx[f]<1||j+fy[f]>4||j+fy[f]<1 ) continue; else return 0; } return 1; } void dfs(int i,int j) {

2015年蓝桥杯C组试题及答案

2014年蓝桥杯c语言试题及答案 发布时间:2015-04-09 1. 标题: 马虎的算式 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案竟然是对的!! 因为 36 * 495 = 396 * 45 = 17820 类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54 假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0) 能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢? 请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。 满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。 答案直接通过浏览器提交。 注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。 答案:142 2. 标题: 振兴中华 小明参加了学校的趣味运动会,其中的一个项目是:跳格子。 地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg) 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。 要求跳过的路线刚好构成“从我做起振兴中华”这句话。 请你帮助小明算一算他一共有多少种可能的跳跃路线呢? 答案是一个整数,请通过浏览器直接提交该数字。 答案:35 3. 题目标题: 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说: “我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请你推算一下,他当时到底有多年轻。 通过浏览器,直接提交他那时的年龄数字。 注意:不要提交解答过程,或其它的说明文字。 答案:18 4. 标题: 幻方填空

相关文档
最新文档