2013年蓝桥杯C++组C组决赛题目汇总


1.好好学习(全排列)

  汤姆跟爷爷来中国旅游。一天,他帮助中国的小朋友贴标语。他负责贴的标语是分别写在四块红纸上的四个大字:“好、好、学、习”。

    但是汤姆不认识汉字,他就想胡乱地贴成一行。

    请你替小汤姆算一下,他这样乱贴,恰好贴对的概率是多少?

    答案是一个分数,请表示为两个整数比值的形式。例如:1/3 或 2/15 等。

    如果能够约分,请输出约分后的结果。

    注意:不要书写多余的空格。

只需要全排列一下,然后看一眼就可以了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int main(){
	char c[5]={'A','B','C','D'};
	int count=0;
	do{
		cout<<c[0]<<" "<<c[1]<<" "<<c[2]<<" "<<c[3]<<endl;
		count++;
	} while(next_permutation(c,c+4));
	cout<<count<<endl;
	return 0;
}

2.埃及分数
    古埃及曾经创造出灿烂的人类文明,他们的分数表示却很令人不解。古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式。
    这里,a 和 b 必须是不同的两个整数,分子必须为 1
    比如,2/15 一共有 4 种不同的分解法(姑且称为埃及分解法):

1/8 + 1/120
1/9 + 1/45
1/10 + 1/30
1/12 + 1/20


    那么, 2/45 一共有多少个不同的埃及分解呢(满足加法交换律的算同种分解)? 请直接提交该整数(千万不要提交详细的分解式!)。
    请严格按照要求,通过浏览器提交答案。

就是直接把除法变成乘法,两个循环跑一下就行,注意注意,循环的范围要大一点,如果小了的话会缺少一些情况,所以要多试一试,直到再怎么增加范围结果都不变的时候为止

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int main(){
	int count=0;
	for(int x=1;x<=10000;x++){
		for(int y=1;y<=10000;y++){
			if(2*x*y==45*(x+y)&&x!=y){
				cout<<x<<" "<<y<<endl;
				count++;
			}
		}
	}
	cout<<count<<endl;
	return 0;
}


3.正负金字塔

    看下面的图形:

     + - + - - + - + - - + - - + -
      - - - + - - - - + - - + - -
       + + - - + + + - - + - - +
        + - + - + + - + - - + -
         - - - - + - - - + - -
          + + + - - + + - - +
           + + - + - + - + -
            + - - - - - - -
             - + + + + + +
              - + + + + +
               - + + + +
                - + + +
                 - + +
                  - +
                   -

    它是由正号和负号组成的金字塔形状。其规律是:每个符号的左上方和右上方符号如果相同,则输出为正号,否则为负号。

    其第一行数据由外部输入。

    以下代码实现了该功能。请仔细阅读代码,并填写划线部分缺失的代码。


void f(char* x, int space, int n)
{
    int i;
    if(n<1) return;

    for(i=0; i<space; i++) printf(" ");
    for(i=0; i<n; i++) printf("%c ", x[i]);
    printf("\n");
    
    for(i=0; i<n-1; i++) x[i] = ______________x[i]==x[i+1]?'+':'-'______________;
    f(x,space+1,n-1);         
}

// 用于f的测试
int test()
{
    char x[] = "+-+--+-+--+--+-";
    //char x[] = "+-+";
    f(x, 5, sizeof(x)-1);
    return 0;
}

 

 请分析代码逻辑,并推测划线处的代码,通过网页提交。
 注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!


4.横向打印二叉树

    二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。

    当遇到空子树时,则把该节点放入那个位置。 

    比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如图1所示。 

    本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树。 

    输入数据为一行空格分开的N个整数。 N<100,每个数字不超过10000。
    输入数据中没有重复的数字。 

    输出该排序二叉树的横向表示。 对应上例中的数据,应输出:

   |-12
10-|
   |-8-|
       |   |-7
       |-5-|
           |-4


    为了便于评卷程序比对空格的数目,请把空格用句点代替:
...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4

例如:
用户输入:
10 5 20
则程序输出:
...|-20
10-|
...|-5

再例如:
用户输入:
5 10 20 8 4 7
则程序输出:
.......|-20
..|-10-|
..|....|-8-|
..|........|-7
5-|
..|-4


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


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

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

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

提交时,注意选择所期望的编译器类型(千万不要混淆c和cpp)。


5.危险系数
    抗日战争时期,冀中平原的地道战曾发挥重要作用。

    地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
 
    我们来定义一个危险系数DF(x,y):
    对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。
    相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。

    本题的任务是:已知网络结构,求两站点之间的危险系数。

    输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,通道数;
    接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条通道;
    最后1行,两个数u,v,代表询问两点之间的危险系数DF(u, v)。

    输出:一个整数,如果询问的两点不连通则输出-1.

例如:
用户输入:
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
则程序应该输出:
2

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

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

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

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

提交时,注意选择所期望的编译器类型(千万不要混淆c和cpp)。

https://blog.csdn.net/red_red_red/article/details/89056956
6.网络寻路
    X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。
    该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。
    源地址和目标地址可以相同,但中间节点必须不同。
    如图1所示的网络。

    1 -> 2 -> 3 -> 1  是允许的
    1 -> 2 -> 1-> 2 或者 1->2->3->2 都是非法的。

    输入数据的第一行为两个整数N M,分别表示节点个数和连接线路的条数(1<=N<=10000; 0<=M<=100000)。
    接下去有M行,每行为两个整数 u 和 v,表示节点u 和 v 联通(1<=u,v<=N , u!=v)。

    输入数据保证任意两点最多只有一条边连接,并且没有自己连自己的边,即不存在重边和自环。

    输出一个整数,表示满足要求的路径条数。
例如:
用户输入:
3 3
1 2
2 3
1 3
则程序应该输出:
6
再例如:
用户输入:
4 4
1 2
2 3
3 1
1 4
则程序应该输出:
10
资源约定:
峰值内存消耗 < 64M
CPU消耗  < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

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

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

提交时,注意选择所期望的编译器类型(千万不要混淆c和cpp)。

https://blog.csdn.net/red_red_red/article/details/89058503

 


 


 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值