zoukankan      html  css  js  c++  java
  • 第六届蓝桥杯大赛个人赛省赛(软件类)C语言B组--2015年

    1、

    奖券数目

    有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。

    虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。

    思路:循环遍历每一位数字的情况,除去带有”4“的。第一位从不能取0,所以从1开始。

    答案:52488

    编程实现:

    #include<stdio.h>
    int main(){
    	int i,count=0;
    	for(i=10000;i<100000;i++){
    		if(i%10 == 4  || (i/10)%10==4 || (i/100)%10 == 4 ||(i/1000)%10 == 4 || i/10000 == 4){
    			continue; 
    		}
    		count++; 
    	} 
    	printf("%d",count);
    	return 0;
    }  

    2、

    星系炸弹

    在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。

    每个炸弹都可以设定多少天之后爆炸。

    比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。

    有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

    请填写该日期,格式为yyyy-mm-dd  即4位年份2位月份2位日期。比如:2015-02-19

    思路:计算2014年11月9日之后1000天的日期。在这可以编程结合手算,写一个闰年函数判断2015、2016、2017这三年的情况。

    答案为:2017-08-05

    3、

    三羊献瑞

    观察下面的加法算式:

           祥 瑞生 辉

     +    三羊 献 瑞

    -------------------

     三 羊 生 瑞 气

    其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

    请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

    思路:循环遍历每一个汉字代表的数字。

    即可转换为

            a b c d

    +     e f  g b

    -------------

       e  f  c  b h

    答案为:1085

    //三羊献瑞

    //三羊献瑞
    #include<stdio.h>
    int main(){
    	int a,b,c,d,e,f,g,h;
    	for(a=1;a<=9;a++){
    		for(b=0;b<=9;b++){
    			if(a==b)
    				continue;
    			for(c=0;c<=9;c++){
    				if(a==c||b==c)
    					continue;
    				for(d=0;d<=9;d++){
    					if(a==d||b==d||c==d)
    						continue;
    					for(e=1;e<=9;e++){
    						if(a==e||b==e||c==e||d==e) 
    							continue;
    						for(f=0;f<=9;f++){
    							if(a==f||b==f||c==f||d==f||e==f)
    								continue;
    							for(g=0;g<=9;g++){
    								if(a==g||b==g||c==g||d==g||e==g||f==g)
    									continue;
    								for(h=0;h<=9;h++){
    									if(a==h||b==h||c==h||d==h||e==h||f==h||g==h)
    										continue;
    									if((a*1000+b*100+c*10+d)+(e*1000+f*100+g*10+b) == (e*10000+f*1000+c*100+b*10+h))
    									{
    										printf("%d %d %d %d
    ",a,b,c,d);
    										printf("%d %d %d %d
    ",e,f,g,b);
    										printf("%d %d %d %d %d
    ",e,f,c,b,h);
    									}	
    									
    								}
    							}
    						}
    					} 
    				} 
    			}
    		}
    	}
    	return 0;
    }  

    4、

    格子中输出
    StringInGrid函数会在一个指定大小的格子中打印指定的字符串。
    要求字符串在水平、垂直两个方向上都居中。
    如果字符串太长,就截断。
    如果不能恰好居中,可以稍稍偏左或者偏上一点。
    下面的程序实现这个逻辑,请填写划线部分缺少的代码。

    5、

    九数组分数
    1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
    下面的程序实现了该功能,请填写划线部分缺失的代码。

    //九数组分数

    #include <stdio.h>
     
    void test(int x[])
    {
    	int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
    	int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
    	
    	if(a*3==b) printf("%d / %d
    ", a, b);
    }
     
    void f(int x[], int k)
    {
    	int i,t;
    	if(k>=9){
    		test(x);
    		return;
    	}
    	
    	for(i=k; i<9; i++){
    		{t=x[k]; x[k]=x[i]; x[i]=t;}
    		f(x,k+1);
    		{t=x[k]; x[k]=x[i]; x[i]=t;} // 填空处
    	}
    }
    	
    int main()
    {
    	int x[] = {1,2,3,4,5,6,7,8,9};
    	f(x,0);	
    	return 0;
    }  

    6、

    加法变乘法

    我们都知道:1+2+3+... + 49 = 1225

    现在要求你把

    其中两个不相邻的加号变成乘号,使得结果为2015

    比如:

    1+2+3+...+10*11+12+...+27*28+29+...+49 =2015

    就是符合要求的答案。

    请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

    思路:用1225和2015分别减去两个位置的数后比较是否相等。

    答案:16

    //加法变乘法
    
    //x,y  ->  1225-(x+x+1)-(y+y+1) == 2015 - (x^2+x)-(y^2+y) 并且,y-x>2
    
    #include<stdio.h>
    
    int main(){
    
            int x,y;
    
            for(x=0;x<=46;x++){
    
                     for(y=x+3;y<=49;y++){
    
                             if((1225-(x+x+1)-(y+y+1))== (2015 - (x*x+x)-(y*y+y)))
    
                                      printf("x = %d
    ",x);
    
                     }
    
            }
    
            return 0;
    
    }

    7、

    牌型种数

    小明被劫持到X赌城,被迫与其他3人玩牌。

    一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。

    这时,小明脑子里突然冒出一个问题:

    如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

    思路:循环遍历每个点数所选择的张数,每个点数最多可以选4张,最少可以选0张即不选,每当牌总数达到13张则计数。

    答案:3598180

    循环暴力法

    #include<stdio.h>
    
    int main(){
    
            int a,b,c,d,e,f,g,h,i,j,k,l,m;
    
            int count = 0;
    
            for(a=0;a<=4;a++){
    
                     for(b=0;b<=4;b++){
    
                             for(c=0;c<=4;c++){
    
                                      for(d=0;d<=4;d++){
    
                                              for(e=0;e<=4;e++){
    
                                                      for(f=0;f<=4;f++){
    
                                                               for(g=0;g<=4;g++){
    
                                                                       for(h=0;h<=4;h++){
    
                                                                                for(i=0;i<=4;i++){
    
                                                                                        for(j=0;j<=4;j++){
    
                                                                                                for(k=0;k<=4;k++){
    
                                                                                                         for(l=0;l<=4;l++){
    
                                                                                                                 for(m=0;m<=4;m++){
    
                                                                                                                         if(a+b+c+d+e+f+g+h+i+j+k+l+m == 13){
    
                                                                                                                                  count++;
    
                                                                                                                          }
    
                                                                                                                 }
    
                                                                                                         }
    
                                                                                                }
    
                                                                                        }
    
                                                                                }
    
                                                                       }
    
                                                               }
    
                                                      }
    
                                              }
    
                                      }
    
                             }
    
                     }
    
            }
    
            printf("%d",count);
    
            return 0;
    
    }

    8、

    移动距离

    X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...

    当排满一行时,从下一行相邻的楼往反方向排号。

    比如:当小区排号宽度为6时,开始情形如下:

      1   2   3  4 5  6

    12 11 10 9 8  7

    13 14 15 .....

    我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

    输入为3个整数w m n,空格分开,都在1到10000范围内

    w为排号宽度,m,n为待计算的楼号。

    要求输出一个整数,表示m n两楼间最短移动距离。

    例如:

    用户输入:

    6 8 2

    则,程序应该输出:

    4

    再例如:

    用户输入:

    4 7 20

    则,程序应该输出:

    5

    资源约定:

    峰值内存消耗 <256M

    CPU消耗 < 1ms

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

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

    注意: main函数需要返回0

    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

    注意: 所有依赖的函数必须明确地在源文件中 #include<xxx>, 不能通过工程设置而省略常用头文件。

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

    思路:对每个数字的所在行的行坐标进行奇偶性判断,得出列坐标,最后用两点坐标差求距离。

    //  m/w 与n/w是所在行数,行数为偶数,从左往右;为奇数,从右往左

    #include<stdio.h>
    
    #include<stdlib.h>
    
    int GetMinLen(int w,int m,int n){
    
            int col_m,col_n,row_m,row_n,col,row;
            row_m = m/w;
            row_n = n/w;
            if(m%w == 0)
                     row_m -= 1;
            if(n%w == 0)
                     row_n -= 1;
            row = abs(row_m - row_n);
            if(row_m%2 == 1)
                     col_m = w-m%w;
            else
                     col_m = m%w-1;
            if(row_n%2 == 1)
                     col_n = w-n%w;
            else
                     col_n = n%w-1;
            col = abs(col_m - col_n);
            return row+col;
    
    }
    
    int main(){
    
            int w,m,n,len;
    
            printf("输入w,m,n的值
    ");
    
            scanf("%d %d %d",&w,&m,&n);
    
            len = GetMinLen(w,m,n);
    
            printf("%d",len);
    
            return 0;
    
    }

    9、

    垒骰子

    赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。

    经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!

    我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。

    假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。

    atm想计算一下有多少种不同的可能的垒骰子方式。

    两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。

    由于方案数可能过多,请输出模10^9 + 7 的结果。

    不要小看了 atm 的骰子数量哦~

    「输入格式」

    第一行两个整数 n m

    n表示骰子数目

    接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。

    「输出格式」

    一行一个数,表示答案模10^9 + 7 的结果。

    「样例输入」

    2 1

    1 2

    「样例输出」

    544

    「数据范围」

    对于 30% 的数据:n <= 5

    对于 60% 的数据:n <= 100

    对于 100% 的数据:0 < n <= 10^9, m <= 36

    资源约定:

    峰值内存消耗 <256M

    CPU消耗  < 2000ms

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

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

    注意: main函数需要返回0

    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

    注意: 所有依赖的函数必须明确地在源文件中 #include<xxx>, 不能通过工程设置而省略常用头文件。

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

    思路:

    矩阵快速幂

    同理我们只考虑底面的情况,最后乘上4^n即可。

    我们设六阶矩阵An,其中An的第a行第b列表示第一层底面数字为a、第n层数字为b的所有排列的情况

    记六阶矩阵X中,第a行第b列表示相邻两层的是否能成功连接的情况。a和b能连则为1,a和b不能连则为0(注意是相邻两层的底面,不是衔接面,所以要转化,比如题给的1 2要改为1 5)

    根据上述定义,易得递推式:

    An = An-1X,且 A1 = E(六阶单位矩阵)

    可得到An的表达式为An = Xn-1

    那么ans就是矩阵 Xn-1 的36个元素之和

    注意最后侧面的4^n也要二分幂不然会爆炸

    10、

    生命之树

    在X森林里,上帝创建了生命之树。

    他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。

    上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 {a, v1, v2, ..., vk, b} 使得这个点列中的每个点都是S里面的元素,且序列中相邻两个点间有一条边相连。

    在这个前提下,上帝要使得S中的点所对应的整数的和尽量大。

    这个最大的和就是上帝给生命之树的评分。

    经过atm的努力,他已经知道了上帝给每棵树上每个节点上的整数。但是由于 atm 不擅长计算,他不知道怎样有效的求评分。他需要你为他写一个程序来计算一棵树的分数。

    「输入格式」

    第一行一个整数 n 表示这棵树有 n 个节点。

    第二行 n 个整数,依次表示每个节点的评分。

    接下来 n-1 行,每行 2 个整数 u, v,表示存在一条 u 到 v 的边。由于这是一棵树,所以是不存在环的。

    「输出格式」

    输出一行一个数,表示上帝给这棵树的分数。

    「样例输入」

    5

    1 -2 -3 4 5

    4 2

    3 1

    1 2

    2 5

    「样例输出」

    8

    「数据范围」

    对于 30% 的数据,n <= 10

    对于 100% 的数据,0 < n <= 10^5, 每个节点的评分的绝对值不超过 10^6 。

    资源约定:

    峰值内存消耗 < 256M

    CPU消耗 < 3ms

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

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

    注意: main函数需要返回0

    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>,不能通过工程设置而省略常用头文件。

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

    ————————————————

  • 相关阅读:
    c:forTokens标签循环输出
    jsp转long类型为date,并且格式化
    spring中@Param和mybatis中@Param使用区别(暂时还没接触)
    734. Sentence Similarity 有字典数组的相似句子
    246. Strobogrammatic Number 上下对称的数字
    720. Longest Word in Dictionary 能连续拼接出来的最长单词
    599. Minimum Index Sum of Two Lists两个餐厅列表的索引和最小
    594. Longest Harmonious Subsequence强制差距为1的最长连续
    645. Set Mismatch挑出不匹配的元素和应该真正存在的元素
    409. Longest Palindrome 最长对称串
  • 原文地址:https://www.cnblogs.com/Hqx-curiosity/p/11934625.html
Copyright © 2011-2022 走看看